我在 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
应用函数 fun
(例如, mean
)在该 data.frame
的每一列上.如果data.frame
仅包含 numeric
值,我没有任何问题:apply(cars, 2, mean)
speed dist
15.40 42.98
但是当我尝试使用我的
data.frame
时包含 numeric
和 character
数据,它似乎失败了: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
当然,我期待得到
NA
为 character
列,但我想获取 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
最佳答案
?apply
的描述的第一句说:
If X is not an array but an object of a class with a non-null dim value (such as a data frame), apply attempts to coerce it to an array via as.matrix if it is two-dimensional (e.g., a data frame) or via as.array.
矩阵在 R 中只能是单一类型。当数据框被强制转换为矩阵时,即使只有一个字符列,所有内容都以字符结束。
我想我欠你一个替代方案的描述,所以你去吧。数据框实际上只是列表,所以如果你想对每一列应用一个函数,使用
lapply
或 sapply
反而。
关于r - apply() 为每一列提供 NA 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9710484/