apply()为每列提供NA值

Pie*_*rre 5 r apply

我最近一直遇到这个奇怪的问题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包含numericcharacter数据时,它似乎失败了:

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)

当然,我期待得到NAcharacter列,但我想获得值的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中的矩阵只能是单一类型.当数据框被强制转换为矩阵时,如果甚至有一个字符列,则所有内容都以字符结尾.

我想我欠你一个替代品的描述,所以你走了.数据框实际上只是列表,因此如果要将函数应用于每个列,请使用lapplysapply替代.


Bri*_*ggs 5

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)