【发布时间】:2012-03-14 21:22:43
【问题描述】:
我最近在apply 上遇到了这个奇怪的问题。考虑以下示例:
set.seed(42)
df <- data.frame(cars, foo = sample(LETTERS[1:5], size = nrow(cars), replace = TRUE))
head(df)
speed dist foo
1 4 2 E
2 4 10 E
3 7 4 B
4 7 22 E
5 8 16 D
6 9 10 C
我想使用apply 在该data.frame 的每一列上应用函数fun(例如mean)。如果data.frame 只包含numeric 值,我没有任何问题:
apply(cars, 2, mean)
speed dist
15.40 42.98
但是当我尝试使用包含numeric 和character 数据的data.frame 时,它似乎失败了:
apply(df, 2, mean)
speed dist foo
NA NA NA
Warning messages:
1: In mean.default(newX[, i], ...) :
argument is not numeric or logical: returning NA
2: In mean.default(newX[, i], ..) :
argument is not numeric or logical: returning NA
3: In mean.default(newX[, i], ...) :
argument is not numeric or logical: returning NA
当然,我希望为character 列获取NA,但我还是想为numeric 列获取值。
sapply(df, class)
speed dist foo
"numeric" "numeric" "factor"
任何指针都将不胜感激,因为我觉得我在这里遗漏了一些非常明显的东西!
> sessionInfo()
R version 2.14.1 (2011-12-22)
Platform: x86_64-unknown-linux-gnu (64-bit)
locale:
[1] LC_CTYPE=en_GB.UTF-8 LC_NUMERIC=C
[3] LC_TIME=en_GB.UTF-8 LC_COLLATE=en_GB.UTF-8
[5] LC_MONETARY=en_GB.UTF-8 LC_MESSAGES=en_GB.UTF-8
[7] LC_PAPER=C LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_GB.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
【问题讨论】: