2016-11-08 4 views
0

다음과 같은 방식으로 데이터 프레임의 열을 결합 할 수 있습니까? R (dplyr, tidyr) : 결합/결합 관련 열

data <- data.frame(user.A = c(2,4,6), 
       user.B = c(11,13,15), 
       other.A = c(102,104,106), 
       other.B = c(201,103,105), 
       id = c('001', '004', '006')) 
data 
    user.A user.B other.A other.B id 
1  2  11  102  201 001 
2  4  13  104  103 004 
3  6  15  106  105 006 

# Desired output. 
    user other id 
1 2 102 001 
2 11 201 001 
3 4 104 004 
4 13 103 004 
5 6 106 006 
6 15 105 006 

나는이 dyplr 또는 tidyr와 함께 할 수 있다고 생각합니다. dplyrbind_rows 기능은 비슷한 기능을하지만 원하는 출력을 생성하지 않습니다.

답변

2

meltdata.table에서 훨씬 쉽습니다. measurepatterns을 여러 개 사용할 수 있습니다. 다음과 같이

'사용자'로
library(data.table) 
melt(setDT(data), measure = patterns("^user", "^other"), 
     value.name = c("user", "other"))[, variable := NULL][] 
# id user other 
#1: 001 2 102 
#2: 004 4 104 
#3: 006 6 106 
#4: 001 11 201 
#5: 004 13 103 
#6: 006 15 105 

, '기타'열 numeric, 우리는 또한 당신은 reshape 기능의 변화를 사용할 수 있습니다 tidyr

library(dplyr) 
library(tidyr) 
gather(data, var, val, -id) %>% 
     separate(var, into = c("var1", "var2")) %>% 
     spread(var1, val) %>% 
     select(-var2) 
# id other user 
#1 001 102 2 
#2 001 201 11 
#3 004 104 4 
#4 004 103 13 
#5 006 106 6 
#6 006 105 15 
2

에서 gather/spread를 사용할 수 있습니다

new_data <- reshape(data, varying = 1:4, direction = "long") 

varying 인수가 사용됩니다. d를 눌러 피벗 할 열을 지정하십시오.

+0

모든 혐오 기지'reshape()'가 도착하면, 그것은 정말로 때로는 영리합니다. – thelatemail