R(dplyr,tidyr):组合/聚合相关列

时间:2016-11-08 03:34:14

标签: 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

我相信可以使用dyplrtidyr来完成此操作。 bind_rows中的dplyr函数执行类似操作,但不会创建所需的输出。

2 个答案:

答案 0 :(得分:2)

来自melt的{​​{1}}会更容易,因为它可能需要多个data.table measure

patterns

作为“用户”,“其他”列为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

答案 1 :(得分:2)

您可以使用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 功能的变体,如下所示:

reshape

new_data <- reshape(data, varying = 1:4, direction = "long") 参数用于指定要转向的列。