2010-03-23 102 views
10

我试图访问一个$使用下面的例子:

df<-data.frame(a=c("x","x","y","y"),b=c(1,2,3,4)) 

> df 
    a b 
1 x 1 
2 x 2 
3 y 3 
4 y 4 

test_fun <- function (data.frame_in) { 
    print (data.frame_in[1]) 
    } 

我现在可以访问$一个,如果我使用的第一列的索引:

apply(df, 1, test_fun)

a 
"x" 
    a 
"x" 
    a 
"y" 
    a 
"y" 
[1] "x" "x" "y" "y" 

但我不能使用$符号访问列$ a:错误:“$运算符对原子向量无效”

test_fun_2 <- function (data.frame_in) { 
    print (data.frame_in$a) 
    } 

>apply(df, 1, test_fun_2) 
Error in data.frame_in$a : $ operator is invalid for atomic vectors 

这不可能吗?

回答

19

你可以改为使用plyr包中的adply

library(plyr) 
adply(df, 1, function (data.frame_in) print(data.frame_in$a)) 
+1

美丽。我花了很长一段时间寻找关于“如何使用适用于数据框”的问题,这些问题最终只能解决特定问题。这不仅回答了我看到的所有问题,而且也解决了我的问题! – 2015-01-28 00:54:33

5

因为apply改变你的函数的数据类型:

> apply(df, 1, class) 
[1] "character" "character" "character" "character" 

> apply(df, 1, colnames) 
NULL 

由于没有列名,你不能与$操作参考值。

apply文档:

If X is not an array but has a dimension attribute, apply attempts to coerce it to an array via as.matrix if it is two-dimensional (e.g., data frames) or via as.array.

+6

没有关于如何缓解这个问题的建议? – Richard 2012-07-03 22:23:06

+1

欢迎来到R ... – Gus 2016-03-01 23:04:30

9

因为data.frame.in不是data.frame:

apply(df, 1, function(v){print(class(v))}) 

但你可以访问命名的元素:

test_fun_2 <- function (data.frame_in) { 
+  print (data.frame_in['a'])} 
+0

美丽的解决方案,谢谢! – Richard 2012-07-03 22:24:01