2010-03-23 38 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