【发布时间】:2016-08-15 22:48:00
【问题描述】:
我正在尝试在 R 中执行交叉制表并计算均值。
首先我选择了变量并创建了一个新的数据框:
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():
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))
谁能告诉我是什么导致了警告?
【问题讨论】:
-
你的
cbind正在把所有东西都变成一个字符 -
cbind返回一个矩阵,一个矩阵只能有一种数据模式,因此您的数字数据被强制转换为字符,然后 as.data.frame 将这些字符列转换为因子。相反,只需使用as.data.frame(...)而不是as.data.frame(cbind(...))。 -
另外,对于按组计算计数、平均值和其他统计数据,您可能会发现
dplyr或data.table包更方便。例如dplyr,按组汇总(使用内置的mtcars数据框):library(dplyr); mtcars %>% group_by(am, vs) %>% summarise_all(funs(n(), mean(.)))。 -
非常感谢!我认为使用
as.data.frame制作数据框是错误的。它返回Error in !optional : invalid argument type。对于dplyr,您能否在此处提供链接或详细示例? @eipi10 @Richard Telford -
抱歉,指的是
data.frame(...),而不是as.data.frame(...)。对于 dplyr,请参阅the vignette。