当我应用于包含字符串的data.frames时,为什么所有元素都会被字符串化?

时间:2012-11-23 01:22:01

标签: r

在包含字符串的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"
> 

为什么会这样?我怎么能避免它?

2 个答案:

答案 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