2016-08-15 28 views
0

我想在R中执行交叉表并计算方法。使用with()执行交叉制表时的警告?

首先,我所选择的变量并创建一个新的数据帧:

 seed <- ruk_trial$Ruk_seed_input #integer 
     soilec <- ruk_trial$Ruk_soilEC  #num 
     ruk_trial$code_smoo[ruk_trial$code_smoo == 0] <- 'US' 
     ruk_trial$code_smoo[ruk_trial$code_smoo == 1] <- 'LS' 
     ruk_trial$code_smoo[ruk_trial$code_smoo == 2] <- 'HS' 
     zones <- ruk_trial$code_smoo  #chr 
     netincome <- ruk_trial$NetIncome #num 
     yield <- ruk_trial$Dry_yield  #num 
     ruk_df <- as.data.frame(cbind(seed,soilec,zones,netincome,yield)) 

然后我用()的使用:

 with(ruk_df, tapply(netincome, list(zones=zones, seed=seed), mean)) 

但事实证明:

 seed 
    zones 105 120 75 90 
    HS NA NA NA NA 
    LS NA NA NA NA 
    US NA NA NA NA 
    There were 12 warnings (use warnings() to see them) 

    > warnings() 
Warning messages: 
1: In mean.default(X[[i]], ...) : 
    argument is not numeric or logical: returning NA 

如果我使用原始数据集,它的工作原理:

> cross.tab<- with(ruk_trial, tapply(netincome, list(zones=zones,seed=seed), mean)) 

任何人都可以告诉我什么会导致警告?

+2

你'cbind'是把什么事都一个字符 –

+1

'cbind'返回一个矩阵,矩阵只能有一个数据模式,让您的数字数据被越来越强制转换为字符,然后as.data.frame将这些字符列转换为因子。相反,只需执行'as.data.frame(...)'而不是'as.data.frame(cbind(...))'。 – eipi10

+1

此外,为了计算计数,平均值和其他统计数据,您可能会发现'dplyr'或'data.table'包更方便。例如,在'dplyr'中,按组进行汇总(使用内建的'mtcars'数据框):'library(dplyr); mtcars%>%group_by(am,vs)%>%summarise_all(funs(n(),mean(。)))''。 – eipi10

回答

1

试试这个:

ruk_df <- data.frame(seed,soilec,zones,netincome,yield, stringsAsFactors=FALSE) 
+0

谢谢!有用。我刚刚意识到使用'as.data.frame'来创建一个数据框是完全错误的。 'cbind'已将所有变量转换为因子。 @renato vitolo –

+0

Richard和eipi10解释了由'cbind'转换为'character',然后由'as.data.frame'转换为'factor'。 –