在调用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)
为什么会这样?我怎么能避免呢?
发生这种情况的原因是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)
| 归档时间: |
|
| 查看次数: |
81 次 |
| 最近记录: |