2010-03-23 7 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]) 
    } 

나는 이제 액세스 $ a를 내가 첫 번째 열에 대한 인덱스 사용하는 경우 :

apply(df, 1, test_fun)

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

을하지만 오류 : "$ 연산자가 원자 벡터에 유효하지 않습니다."

이것은 가능하지 않습니까?

답변

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