1

在调用apply包含字符串的 data.frame 时,所有其他元素似乎都被强制转换为字符串,然后再传递给提供的函数:

> 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"
> 

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

4

2 回答 2

5

发生这种情况的原因是该apply函数将您的 data.frame 强制转换为矩阵,然后执行操作。如果您查看代码,apply您会发现:

if (is.object(X)) 
    X <- if (dl == 2L) 
        as.matrix(X)
    else as.array(X)

矩阵只能保存一种数据类型,当有多种数据类型时,它会强制转换为最高级别的一种。在你的情况下,性格。那么你能做什么呢?使用aaplyfrom 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 
于 2012-11-23T01:52:28.887 回答
0

一种解决方案是将 y 转换为 data.frame

apply(x,1,function(y){as.data.frame(y)[2,]})

[1] 6 7 8

于 2012-11-23T01:50:33.563 回答