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

当我应用于包含字符串的data.frames时,为什么所有元素都是字符串化的?,r,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" >

在包含字符串的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"
> 
>x应用(x,1,函数(y){y[“b”]})
[1] 6 7 8
>x应用(x,1,函数(y){y[“b”]})
[1] "6" "7" "8"
> 

为什么会这样?如何避免它?

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

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

[1] 6 7 8

一种解决方案是将y转换为数据帧

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

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

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

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

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

@TimN我使用as.data.frame,因为在这种情况下y的类是data.frame。对于POSIXct,y的类是什么?@TimN我使用as.data.frame,因为在这种情况下y的类是data.frame。对于POSIXct,y的类是什么?注意,您实际上不需要匿名函数
aaply(x,1,`[`,[`,'b',.expand=FALSE)
可以很好地工作。注意,您实际上并不需要匿名函数
aaply(x,1,`[[`,'b',.expand=FALSE)
可以很好地工作。