在包含字符串的data.frame上调用apply
时,所有其他元素在传递给提供的函数之前似乎都被强制转换为字符串:
> x<-data.frame(a=1:3,b=6:8)
> apply(x,1,function(y){y["b"]})
[1] 6 7 8
> x<-data.frame(a=1:3,b=6:8,d=c("a","bc","def"))
> apply(x,1,function(y){y["b"]})
[1] "6" "7" "8"
>
为什么会这样?我怎么能避免它?
答案 0 :(得分:5)
发生这种情况的原因是apply
函数将data.frame强制转换为矩阵,然后执行操作。如果你查看apply
的代码,你会发现:
if (is.object(X))
X <- if (dl == 2L)
as.matrix(X)
else as.array(X)
矩阵只能容纳一种数据类型,当存在多种时,它会强制转换为最高级别的数据类型。在你的情况下,性格。那你能做什么呢?使用aaply
中的plyr
。
稍微修改一下运行代码(使用[[
代替[
,以便返回向量而不是数据框):
x<-data.frame(a=1:3,b=6:8,d=c("a","bc","def"))
library(plyr)
aaply(x, 1, function(y){y[["b"]]}, .expand=FALSE)
1 2 3
6 7 8
答案 1 :(得分:0)
一种解决方案是将y转换为data.frame
apply(x,1,function(y){as.data.frame(y)[2,]})
[1] 6 7 8