在R中收集多组列

时间:2016-07-20 03:33:39

标签: r tidyr

我有一个广泛的数据框架,我需要收集或融入高大的数据帧。 我坚持的部分是我有一组需要保持关联/分组的列。

每个表单提交有2个用户,每个用户有3列数据。我想采用这6列并基本上将它们堆叠成3组,这样每个用户都是一个单独的观察。

这是我的数据或多或少的样本:

wide <- data.frame(
    form.ID     = c(1, 2), 
    entry.date  = c("2016-07-01", "2016-06-15"), 
    user.1      = c("Joe", "Sam"), 
    user.1.ID   = c("A1", "A2"), 
    user.1.data = c("foo", "lorem"),
    user.2      = c("Jane", "Sue"), 
    user.2.ID   = c("B1", "B2"),
    user.2.data = c("bar", "ipsum")
)

wide
#   form.ID entry.date user.1 user.1.ID user.1.data user.2 user.2.ID user.2.data
# 1       1 2016-07-01    Joe        A1         foo   Jane        B1         bar
# 2       2 2016-06-15    Sam        A2       lorem    Sue        B2       ipsum

这是期望的最终状态:

#   form.ID  entry.date   user   user.ID   user.data
# 1       1  2016-07-01    Joe        A1         foo
# 1       1  2016-07-01   Jane        B1         bar
# 2       2  2016-06-15    Sam        A2       lorem    
# 2       2  2016-06-15    Sue        B2       ipsum

我发现了这个问题,但我无法在我的案例中得到给定的答案:

Gather multiple sets of columns

我试过了:

tall.almost <- gather(wide, user.n, user.name, user.1, user.2)
tall.almost
#   form.ID entry.date user.1.ID user.1.data user.2.ID user.2.data user.n user.name
# 1       1 2016-07-01        A1         foo        B1         bar user.1       Joe
# 2       2 2016-06-15        A2       ipsum        B2       lorem user.1       Sam
# 3       1 2016-07-01        A1         foo        B1         bar user.2      Jane
# 4       2 2016-06-15        A2       ipsum        B2       lorem user.2       Sue

我想使用像上面那样的一系列gather()函数,但是我得到了重复的数据。

我试过了:

tall.not.quite <- gather(wide, user.n, user.name, -form.ID, -date)
tall.not.quite
   form.ID entry.date      user.n user.name
1        1 2016-07-01      user.1       Joe
2        2 2016-06-15      user.1       Sam
3        1 2016-07-01   user.1.ID        A1
4        2 2016-06-15   user.1.ID        A2
5        1 2016-07-01 user.1.data       foo
6        2 2016-06-15 user.1.data     ipsum
7        1 2016-07-01      user.2      Jane
8        2 2016-06-15      user.2       Sue
9        1 2016-07-01   user.2.ID        B1
10       2 2016-06-15   user.2.ID        B2
11       1 2016-07-01 user.2.data       bar
12       2 2016-06-15 user.2.data     lorem

以为我可以使用spread()来取出user.n.ID和user.n.data字段,但我也无法使用它。我最终回到了我开始的地方。

我很好并且卡住了。这个R newby非常感谢任何帮助。

谢谢!

1 个答案:

答案 0 :(得分:6)

我们可以使用data.table中的measurelibrary(data.table) melt(setDT(wide), measure = patterns("\\d+$", "user.*ID$", "data$"), value.name = c("user", "user.ID", "user.data"))[, variable:= NULL][order(form.ID)] # form.ID entry.date user user.ID user.data # 1: 1 2016-07-01 Joe A1 foo # 2: 1 2016-07-01 Jane B1 bar # 3: 2 2016-06-15 Sam A2 lorem # 4: 2 2016-06-15 Sue B2 ipsum 可以使用多个{{1}}列。

{{1}}