2017-03-08 6 views
1
library(tidyr) 
library(dplyr) 
library(tidyverse) 

아래는 간단한 데이터 프레임 코드입니다. 다른 열에 분산 된 열 요소 범주로 내 보낸 지저분한 데이터가 있습니다.유사한 열 이름을 참조하여 여러 열을 Tidyr의 단위로 결합

Client<-c("Client1","Client2","Client3","Client4","Client5") 
Sex_M<-c("Male","NA","Male","NA","Male") 
Sex_F<-c(" ","Female"," ","Female"," ") 
Satisfaction_Satisfied<-c("Satisfied"," "," ","Satisfied","Satisfied") 
Satisfaction_VerySatisfied<-c(" ","VerySatisfied","VerySatisfied"," "," ") 
CommunicationType_Email<-c("Email"," "," ","Email","Email") 
CommunicationType_Phone<-c(" ","Phone ","Phone "," "," ") 
DF<-data_frame(Client,Sex_M,Sex_F,Satisfaction_Satisfied,Satisfaction_VerySatisfied,CommunicationType_Email,CommunicationType_Phone) 

나는 tidyr의 "단합"을 사용하여 범주를 단일 열로 재결합하려고합니다.

DF<-DF%>%unite(Sat,Satisfaction_Satisfied,Satisfaction_VerySatisfied,sep=" ")%>% 
unite(Sex,Sex_M,Sex_F,sep=" ") 

그러나, 나는 여러 "단결"라인을 작성해야하고 나는이 세 번 규칙을 위반 느낌, 그래서 내 실제 데이터가 필요로 열 수십 포함, 특히 이후이 쉽게 할 수있는 방법이 있어야합니다 결합 할. 한 번 "단합"을 사용하는 방법이 있지만 일치하는 열 이름을 참조하여 비슷한 이름의 모든 열 이름 (예 : "Sex", "Sex_F", "CommunicationType_Email"의 "CommunicationType" 및 "CommunicationType_Phone")은 위의 수식과 결합됩니까?

필자는 열 이름을 입력 할 수있는 기능에 대해서도 생각하고 있었지만 복잡한 표준 평가가 포함되어 있기 때문에 너무 어려웠습니다.

+0

를 사용할 수있는'DF %> %가'(토, ("토")를 포함) 거의 일치? – Nate

+0

'DF %> % 일치 (토요일, 일치 ("^ 토요일"))' – akrun

답변

1

우리는 아마도 여러 경우에 unite

library(tidyverse) 
DF %>% 
    unite(Sat, matches("^Sat")) 

,

gather(DF, Var, Val, -Client, na.rm = TRUE) %>% 
     separate(Var, into = c("Var1", "Var2")) %>% 
     group_by(Client, Var1) %>% 
     summarise(Val = paste(Val[!(is.na(Val)|Val=="")], collapse="_")) %>% 
     spread(Var1, Val) 
# Client CommunicationType Satisfaction Sex 
#* <chr>    <chr>   <chr> <chr> 
#1 Client1    Email  Satisfied Male 
#2 Client2    Phone VerySatisfied Female 
#3 Client3    Phone VerySatisfied Male 
#4 Client4    Email  Satisfied Female 
#5 Client5    Email  Satisfied Male 
+1

감사합니다. 여러 사례가 훌륭하게 작동합니다! – Mike

0

이와 비슷한? 열이 많으면

result<-with(new.env(),{ 
    Client<-c("Client1","Client2","Client3","Client4","Client5") 
    Sex_M<-c("Male","NA","Male","NA","Male") 
    Sex_F<-c(" ","Female"," ","Female"," ") 
    Satisfaction_Satisfied<-c("Satisfied"," "," ","Satisfied","Satisfied") 
    Satisfaction_VerySatisfied<-c(" ","VerySatisfied","VerySatisfied"," "," ") 
    CommunicationType_Email<-c("Email"," "," ","Email","Email") 
    CommunicationType_Phone<-c(" ","Phone ","Phone "," "," ") 
    x<-ls() 
    categories<-unique(sub("(.*)_(.*)", "\\1", x)) 
    df<-setNames(data.frame(lapply(x, function(y) get(y))), x) 
    for(nm in categories){ 
    df<-unite_(df, nm, x[contains(vars = x, match = nm)]) 
    } 
    return(df) 
}) 

Client CommunicationType Satisfaction  Sex 
1 Client1   Email_  Satisfied_  _Male 
2 Client2   _Phone _VerySatisfied Female_NA 
3 Client3   _Phone _VerySatisfied  _Male 
4 Client4   Email_  Satisfied_ Female_NA 
5 Client5   Email_  Satisfied_  _Male