【问题标题】:Warnings when perform cross tabulation using with()?使用 with() 执行交叉制表时的警告?
【发布时间】: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(...))
  • 另外,对于按组计算计数、平均值和其他统计数据,您可能会发现 dplyrdata.table 包更方便。例如dplyr,按组汇总(使用内置的mtcars数据框):library(dplyr); mtcars %&gt;% group_by(am, vs) %&gt;% 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

标签: r crosstab tapply


【解决方案1】:

试试这个:

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

【讨论】:

  • 谢谢!有用。我刚刚意识到使用as.data.frame 制作数据框是完全错误的。而cbind 已将所有变量转换为因子。 @renato vitolo
  • Richard 和 eipi10 解释了由cbind 转换为character,然后由as.data.frame 转换为factor
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-10
  • 2017-08-05
  • 1970-01-01
  • 2011-12-18
  • 2016-08-16
相关资源
最近更新 更多