2010-03-23 3 views
10

Ich versuche $ a mit dem folgenden Beispiel zuzugreifen:

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

kann ich nun ein Zugang $, wenn ich einen Index für die erste Spalte verwenden:

apply(df, 1, test_fun)

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

Aber ich kann nicht auf die Spalte $ a mit der $ -Notation zugreifen: error: "$ operator ist ungültig für atomare Vektoren"

Ist das nicht möglich?

Antwort

19

Sie könnten Verwenden Sie stattdessen adply aus dem plyr-Paket:

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

Schön. Ich verbrachte eine ganze Weile damit, Fragen zu "Wie verwende ich" auf "Dataframe" anzuwenden, mit Workarounds, die letztendlich nur das spezifische Problem lösen konnten. Dieser beantwortet nicht nur alle Fragen, die ich gesehen habe, sondern auch meine! –

5

Da apply den Datentyp in Ihrer Funktion ändert:

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

> apply(df, 1, colnames) 
NULL 

Da es keine Spaltennamen sind, können Sie nicht die Werte mit dem $ Operator verweisen.

Von der apply Dokumentation:

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

Kein Vorschlag, wie Sie dieses Problem mildern können? – Richard

+1

Willkommen bei R ... – Gus

9

weil data.frame.in ist kein data.frame:

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

aber Sie können mit den genannten Elemente zuzugreifen:

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

Schöne Lösung, danke! – Richard

Verwandte Themen