2016-11-08 6 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. Функция bind_rows в dplyr делает что-то подобное, но не создает этот желаемый результат.

ответ

2

Это намного проще с melt от data.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, мы можем также использовать gather/spread из 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

Вы можете использовать изменение функции reshape следующим образом:

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

Аргумент varying используется d, чтобы указать, какие столбцы будут развернуты.

+0

Для всех баз ненависти 'reshape()' gets, это действительно довольно умно. – thelatemail

 Смежные вопросы

  • Нет связанных вопросов^_^