2014-04-01 2 views
0

각 행에 대해 0이 아닌 모든 열 이름 목록을 포함하는 변수를 작성하려고합니다. 데이터데이터 프레임의 각 행에 0이 아닌 열 이름이있는 변수를 반환하십시오.

예 :

set.seed(334) 
DF <- matrix(sample(0:9,9),ncol=4,nrow=10) 
DF <- as.data.frame.matrix(DF) 
DF$id <- c("ty18","se78","first", "gh89", "sil12","seve","aga2", "second","anotherX", "CH560") 
DF$count <- rowSums(DF[,2:5]>0) 
DF 
>  V1 V2 V3 V4  id count 
> 1 9 4 0 5  ty18  3 
> 2 4 0 5 8  se78  3 
> 3 0 5 8 2 first  4 
> 4 5 8 2 6  gh89  4 
> 5 8 2 6 7 sil12  4 
> 6 2 6 7 3  seve  4 
> 7 6 7 3 9  aga2  4 
> 8 7 3 9 4 second  4 
> 9 3 9 4 0 anotherX  3 
> 10 9 4 0 5 CH560  3 

원하는 출력은 로우 1 않은 새로운 변수 일 것이다 "V1 V2 V4"및 로우 2 "V1 V3 V4"에 대한. 나는 V1-V4 만 사용하고 싶은데, ID 나 카운트는 고려하지 않았다.

SO 도움에이 질문 : For each row return the column name of the largest value

내가 이것을 테스트하려고했으나 첫 번째 테스트는 여기에 단지 전체 행의 최대를 제공합니다 그래서, 심지어 최대를 들어, 내 선택 열을 무시하지 않습니다 내 데이터에서 항상 V1-V4에 있습니다. 오류에도 불구하고

DF$max <- colnames(DF)[apply(DF[,1:4],1,which.max)] 

, 나는 내가 같은 것을 할 필요가 있다고 생각하지만, 내 DF $리스트 시도는 분명히 모든 잘못 :

DF$list <- colnames(DF[,1:4]>0) 

내가

Error in `$<-.data.frame`(`*tmp*`, "list", value = c("V1", "V2", "V3", : 
replacement has 4 rows, data has 10 

받고 있어요 어쩌면 벡터를 셀에 넣으려고하는 것일 수 있습니다. 따라서 그것이 작동하지 않는 이유입니다. 그러나이 정보를 가져 와서 문자열로 만드는 방법을 모르겠습니다. 또한 선택 열의 최대 값이 작동하지 않는 이유를 이해하지 못합니다. simplify2array -

+0

에 대해, 데이터 프레임의 열 부분 집합의 최대의 이름을 얻기를 위해 제공 @orizon 솔루션은'여기 DF $ 최대 <얼마나 ([1, 4, 1, 함수 (X) 이름 (DF DF 는 [4,1] (적용) which.max (X)] ) )' – jessi

답변

1

은 호기심있는 사람들을위한이

DF$nonzeros <- simplify2array(
         apply(
         DF[1:4], 1, 
         function(x) paste(names(DF[1:4])[x != 0], collapse = " ") 
        ) 
       ) 
+0

감사. 왜 최대치가 내가 넣은 방식대로 작동하지 않는지 말해 줄 수 있습니까? 'DF $ max <- simplify2array ( DF [1 : 4], 1, 함수 (x) 이름 (DF [1 : 4]) [최대 (x)] 을 적용하십시오. )' – jessi

+0

내 대답의 수정본은 최대 값이 아닌 최대 값을 반환하기 때문에 "max"와 함께 작동하지 않습니다. 그것은 which.max를 대신 사용하면 도움이되는 것을 되돌려 주지만 이전에 발견 한 것처럼 0이 아닌 모든 항목이 아닌 최대 값을 반환합니다. – orizon

+0

좋습니다. 다시 감사합니다. DF $ nonzeros는 내가 필요한 것이었고, 나는 다른 것을 이해하고 싶었습니다. 귀하의 답변에 정말 감사드립니다. – jessi

관련 문제