我有一个广泛的数据框架,我需要收集或融入高大的数据帧。 我坚持的部分是我有一组需要保持关联/分组的列。
每个表单提交有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非常感谢任何帮助。
谢谢!
答案 0 :(得分:6)
我们可以使用data.table
中的measure
,library(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}}