2016-06-16 1 views
1

다음 문제를 해결해야하지만이를 이해할 수는 없습니다 ... 행의 경우와 같은 데이터 프레임의 행 이름이 필요합니다. 물론 OIL_BE_pet와 같은 값은 1과 같습니다. 물론 원본 데이터는이 2 열 4 행보다 큽니다. 각 행에는 "1"의 최대 값만 있습니다. 데이터 프레임에 나타나는대로이 행 이름을 순서대로 사용하고 싶습니다.행이 1과 같은 경우 행 이름 선택

     OIL_BE_pet  OIL_BE_pet2 
Terminal One    0    0 
Terminal Two    1    0 
Terminal Three    0    1 
Terminal Four    0    0 

여기 해결책은 "터미널 2", "터미널 3"입니다.

미리 감사드립니다.

+4

'rownames (DF) DF $ OIL_BE_pet와 which를 사용할 수 있습니다

는 결과를 제공 DF $ OIL_BE_pet2]' – Roland

+0

왜 작동합니까? 앞서 말했듯이 실제 데이터 프레임에는 훨씬 많은 열/행이 있습니다. 또한 : 예제에서 볼 수 있듯이 데이터가 숫자 인 반면 논리 연산자를 사용하고 있습니다. – nico

+2

R은 논리 비교를 수행하면 숫자 값을 논리 값으로 자동 변환합니다. 재현 할 수 있고 대표적인 예를 제공하지 않으면 내 잘못이 아닙니다. 어쩌면'rownames (DF) [rowSums (DF)> 0]'또는'rownames (DF) [Reduce ("|", DF)]'일 수도 있습니다. – Roland

답변

4

나는 rowSums() 추천 수 :

rownames(df)[rowSums(df)>0]; 
## [1] "Terminal Two" "Terminal Three" 

데이터

df <- data.frame(OIL_BE_pet=c(0L,1L,0L,0L),OIL_BE_pet2=c(0L,0L,1L,0L),row.names=c(
'Terminal One','Terminal Two','Terminal Three','Terminal Four')); 
0

을 다음과 같은 코드를 사용할 수 있습니다

df[as.logical(apply(df,1,sum)),] 

을 이는 행 단위 합계를 계산하고 어떤 행이 0이 아닌 합계를 찾은 다음 해당 행 단위로 데이터 프레임을 부분 집합함으로써 작동합니다. |

> df[as.logical(apply(df,1,sum)),] 
       OIL_BE_pet OIL_BE_pet2 
Terminal Two   1   0 
Terminal Three   0   1 
1

우리는 arr.ind=TRUE

names(which(df!=0, arr.ind=TRUE)[,1]) 
#[1] "Terminal Two" "Terminal Three" 
관련 문제