我最近一直遇到这个奇怪的问题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
Run Code Online (Sandbox Code Playgroud)
我想用它apply来对每一列应用一个函数fun(比方说mean)data.frame.如果data.frame只包含numeric值,我没有任何问题:
apply(cars, 2, mean)
speed dist
15.40 42.98
Run Code Online (Sandbox Code Playgroud)
但是在尝试使用我的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
Run Code Online (Sandbox Code Playgroud)
当然,我期待得到NA的character列,但我想获得值的numeric列反正.
sapply(df, class)
speed dist foo
"numeric" "numeric" "factor"
Run Code Online (Sandbox Code Playgroud)
任何指针都会受到赞赏,因为我觉得我错过了一些非常明显的东西!
> 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
Run Code Online (Sandbox Code Playgroud)
jor*_*ran 10
说明的第一句话?apply说:
如果X不是数组而是具有非空昏暗值的类的对象(例如数据帧),则应用尝试通过as.matrix将其强制转换为数组(如果它是二维的)(例如,数据)框架)或通过as.array.
R中的矩阵只能是单一类型.当数据框被强制转换为矩阵时,如果甚至有一个字符列,则所有内容都以字符结尾.
我想我欠你一个替代品的描述,所以你走了.数据框实际上只是列表,因此如果要将函数应用于每个列,请使用lapply或sapply替代.
apply适用于矩阵,并且矩阵必须是一种类型。因此df被转换成一个矩阵,并且由于它包含一个字符,所以所有列都变成了字符。
> apply(df, 2, class)
speed dist foo
"character" "character" "character"
Run Code Online (Sandbox Code Playgroud)
要获得您想要的,请查看中的colwise和函数。numcolwiseplyr
> numcolwise(mean)(df)
speed dist
1 15.4 42.98
Run Code Online (Sandbox Code Playgroud)