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

Tim*_*Tim 1 r

在调用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"
> 
Run Code Online (Sandbox Code Playgroud)

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

seb*_*n-c 5

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

if (is.object(X)) 
    X <- if (dl == 2L) 
        as.matrix(X)
    else as.array(X)
Run Code Online (Sandbox Code Playgroud)

矩阵只能容纳一种数据类型,当存在多种时,它会强制转换为最高级别的数据类型.在你的情况下,性格.那你能做什么呢?使用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 
Run Code Online (Sandbox Code Playgroud)