2010-03-23 27 views
10

Ben kullanarak Aşağıdaki örnek $ erişmeye çalışıyorum:

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]) 
    } 

Ben artık erişim $ a ilk sütun için bir dizin kullanırsanız:

apply(df, 1, test_fun)

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

Ama $ notation ile $ a sütununa erişemiyor: error: "$ operatörü atomik vektörler için geçersiz"

Bu mümkün değil mi?

cevap

19

Yapabilirsin plyr paketinden adply kullanın:

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

Güzel. Sonunda, sadece belirli problemi çözebileceğim geçici çözümlerle gelen "veri çerçevesine nasıl başvurabilirim" sorusuyla ilgili sorular ararken oldukça fazla zaman harcadım. Bu sadece gördüğüm tüm sorulara cevap vermekle kalmaz, aynı zamanda benim de çözer! –

5

apply Fonksiyonunuzda veri türünü değiştirir Çünkü: hayır sütun isimlerinin geçmesi

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

> apply(df, 1, colnames) 
NULL 

, sen $ operatörle değerleri başvuramaz. apply belgelerine

:

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

bu sorunu hafifletmek için nasıl olarak hiçbir öneri ? – Richard

+1

Hoşgeldiniz ... – Gus

9

data.frame.in çünkü data.frame değildir:

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

ancak adlandırılmış elemanları erişebilirsiniz:

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

Güzel çözüm, teşekkürler! – Richard

İlgili konular