2014-04-22 3 views
2

내가 주변에 검색되었지만 비슷한 질문을 찾을 수 없습니다 ... 여러 개의 논리 열을 하나의 추가 열로 요약하는 방법은 무엇입니까?

나는 이런 비슷한 일이 있습니다

data<-data.frame(RESULT1=c(TRUE,TRUE,FALSE,FALSE),RESULT2=c(FALSE,TRUE,TRUE,FALSE),RESULT3=c(FALSE,FALSE,TRUE,TRUE)) 

을 나는 여러 논리 열을 기반으로 요약 열이 싶었 있도록 이 밝혀졌다 ...

RESULT1 RESULT2 RESULT3 COMMENTS 
1 TRUE FALSE FALSE RESULT1 
2 TRUE TRUE FALSE RESULT1,RESULT2 
3 FALSE TRUE TRUE RESULT2,RESULT3 
4 FALSE FALSE TRUE RESULT3 

내가 아주 서투른 기능 A를 썼다 작업을 수행하지만, 다시이를 작성하는 더 나은 방법이있을 동안

data$COMMENTS<-"" 
for(res in c("RESULT1","RESULT2","RESULT3")){ 
data$COMMENTS[eval(parse(text=paste("data$",res,sep="")))==TRUE] <- sapply(data$COMMENTS[eval(parse(text=paste("data$",res,sep="")))==TRUE],function(x){if(x==""){return(paste(x,res,sep=""))}else{return(paste(x,res,sep=","))}})} 

모든 의견을 보내 주시면 감사하겠습니다.

답변

6

당신은 apply를 사용할 수 있습니다

data["comments"] <- 
    apply(data, 1, function(x) paste0(names(data)[x], collapse=",")) 

가 생산 :

RESULT1 RESULT2 RESULT3  comments 
1 TRUE FALSE FALSE   RESULT1 
2 TRUE TRUE FALSE RESULT1,RESULT2 
3 FALSE TRUE TRUE RESULT2,RESULT3 
4 FALSE FALSE TRUE   RESULT3 
+0

니스! 감사! 나는 신청서를 써서 시험해 보았다 : apply (data, 1, function (x) {ifelse (x == TRUE, names (x) [x == TRUE], "))}), collapse =", " , 그것은 작동하지 않고 있었다. .. 나는 그것을 이런 식으로 쓸 수 있었다라는 것을 모르고 있었다. 감사!!! :) – linp

+0

이'if (x == TRUE)'문제는'x'가 길이가 3 인 벡터이므로 TRUE와 "똑같을"수 없다는 것입니다. 실제로는 결과 벡터의 첫 번째 항목 만 테스트됩니다. –

+0

감사! :) 이것은 응용 프로그램이 어떻게 더 잘 작동하는지 이해하는 데 도움이되는 좋은 예입니다. – linp

관련 문제