gpt4 book ai didi

r - 在 R 中收集多组列

转载 作者:行者123 更新时间:2023-12-04 10:35:00 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Combine Multiple Columns Into Tidy Data [duplicate]

(3 个回答)


4年前关闭。




我有一个很宽的数据框,我需要将其收集或融入一个高大的数据框。
我坚持的部分是我有几组需要保持关联/分组的列。

每个表单提交我有 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 新手将非常感谢任何帮助。

谢谢!

最佳答案

我们可以使用 melt来自 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

关于r - 在 R 中收集多组列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38471866/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com