2010-03-23 16 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" 

लेकिन मैं $ नोटेशन के साथ कॉलम $ ए तक नहीं पहुंच सकता: त्रुटि: "$ ऑपरेटर परमाणु वैक्टर के लिए अमान्य है"

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

सुंदर। मैंने कामकाज के साथ आने वाले "डेटाफ्रेम पर आवेदन कैसे करें" पर प्रश्नों की तलाश में काफी समय बिताया, जो अंत में केवल विशिष्ट समस्या को हल कर सकता था। यह न केवल मैंने देखे गए सभी सवालों का जवाब दिया बल्कि मेरा हल भी किया! –

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

+1

आर में आपका स्वागत है ... – Gus

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

संबंधित मुद्दे

 संबंधित मुद्दे