2012-08-03 4 views
4

이다 (의 극히 일부)와 데이터 프레임 "DF"에 따라 다른 칼럼의 값을 선택하여 새로운 데이터 프레임 열을 작성인덱스 열 여기

및 색인 열 "indx"(1 < = indx < = 11).

"INDX"다른 데이터 프레임에 대한 이전의 단계를 통해 얻은 다음에 "DF"합병 : I 값이 "V (INDX하는 새로운 열"VSEL "를 구축 할 필요

> df 
    v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 indx 
1 223 0 95 605 95 0 0 0 0 189 0 10 
2 32 0 0 32 0 26 0 0 0 32 0 6 
3 0 0 127 95 64 32 0 0 0 350 0 10 
4 141 0 188 0 361 0 0 0 0 145 0 3 
5 32 0 183 0 127 0 0 0 0 246 0 3 
6 67 0 562 0 0 0 0 0 0 173 0 3 
7 64 0 898 0 6 0 0 0 0 0 0 3 
8 0 0 16 0 32 0 0 0 0 55 0 10 
9 0 0 165 0 0 0 312 0 0 190 0 10 
10 0 0 210 0 0 0 190 0 0 11 0 7 

을) "

(즉 1rst 행이다 : VSEL = 189 인해 INDX = 10 V10 = 189)

I 성공적를 사용하여 결과를 수득

"루프 "를 들어

> df 
    v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 indx vsel 
1 223 0 95 605 95 0 0 0 0 189 0 10 189 
2 32 0 0 32 0 26 0 0 0 32 0 6 26 
3 0 0 127 95 64 32 0 0 0 350 0 10 350 
4 141 0 188 0 361 0 0 0 0 145 0 3 188 
5 32 0 183 0 127 0 0 0 0 246 0 3 183 
6 67 0 562 0 0 0 0 0 0 173 0 3 562 
7 64 0 898 0 6 0 0 0 0 0 0 3 898 
8 0 0 16 0 32 0 0 0 0 55 0 10 55 
9 0 0 165 0 0 0 312 0 0 190 0 10 190 
10 0 0 210 0 0 0 190 0 0 11 0 7 190 
,451,515,

코드는 다음과 같습니다

df$vsel = NA 
for (i in seq(1:nrow(df)) ) 
{ 
    r = df[i,] 
    ind = r$indx 
    df[i,"vsel"] = r[ind] 
} 

... 나는이 루프를 피하기 위해 같은 것 (그대로 데이터 프레임이 큰 경우 오히려 느리게).

A (빠른) R 형 방법은 아마도 있습니다 :

(DF, 1, ...)를 적용와 아마

?

또는 ddply? 당신은 그렇게 할 수

답변

1

어떤 도움

감사합니다 ... :

f <- function(i){df[i,df[i,]$indx]} 
temp <- sapply(FUN=f,X=1:length(df[,1])) 
cbind(df,vsel=temp) 
1

여기에 속도 측면에서 이길 어렵다 완전히 벡터화 솔루션입니다.

df$vsel <- as.matrix(df)[1:nrow(df) + nrow(df)*(df$indx-1)] 

이것은 매트릭스가 내부적으로 긴 벡터 (열 현명한)로 저장된다는 사실을 이용합니다. 1:nrow(df)은 행을 지정하고 nrow(df)*(df$indx-1) 열을 지정합니다. df에 데이터 유형이 혼합되어 있으면 모든 것이 문자열로 바뀌어 as.matrix으로 바뀌면이 작업이 작동하지 않습니다.

+0

3 가지 답변 모두 잘 진행 중입니다. 여러분 모두에게 정말 감사드립니다. – Phil

5

매트릭스에서 색인 생성! R은 당신이 묘사하고있는 것을 정확하게하는 방법을 가지고 있습니다. 간단하고 강력하지만 놀랍게도 거의 알려지지 않았습니다.

df$vsel <- df[cbind(1:nrow(df), df$indx)] 
+0

놀라운 소식입니다! 이 명령에 대한 추가 지침 링크가 있습니까? – nassimhddd

+0

'? "["'도움말 페이지를 얻으려면 실행하십시오. 이것은 실제로 유용한 팁이었습니다. 나는 그것을 할 수 있을지 몰랐습니다. – Backlin

관련 문제