gpt4 book ai didi

r - 如何使用 tidyr 填充分组变量的每个值内的完整行?

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

假设我有关于在多个选项之间进行选择的人的数据。我每人排一排,我希望每人排一排和选择选项。所以,如果我有 10 个人有 3 个选择,现在我有 10 行,我想要 30。

所有其他变量都应复制到每个新行。因此,例如,如果我有一个性别变量,它应该在 ID 中保持不变。 (我正在以这种方式设置我的数据以使用 mnlogit 进行分析。)

这似乎是为 tidyr 两个函数 completefill 设计的情况。使用一个简单的例子:

library(lubridate)
library(tidyr)
dat <- data.frame(
id = 1:3,
choice = 5:7,
c = c(9, NA, 11),
d = ymd(NA, "2015-09-30", "2015-09-29")
)

dat %>%
complete(id, choice) %>%
fill(everything())

# Source: local data frame [9 x 4]
#
# id choice c d
# (int) (int) (dbl) (time)
# 1 1 5 9 <NA>
# 2 1 6 9 <NA>
# 3 1 7 9 <NA>
# 4 2 5 9 <NA>
# 5 2 6 9 2015-09-30
# 6 2 7 9 2015-09-30
# 7 3 5 9 2015-09-30
# 8 3 6 9 2015-09-30
# 9 3 7 11 2015-09-29

但这有一些问题——d 的值被正确地结转,但 ID 1 中的 c 值替换了 ID 2 的(正确)NA 值。

我可以尝试一种解决方法,例如用 999 替换所有缺失值,运行 completefill ,然后用 NA 替换 999。 (我想我必须将日期变量转换为字符变量,如果我走这条路,然后再将它们转换回来。)但也许这里有人知道用 tidyr 做到这一点的整洁方法?

编辑:这里所需的输出是:
# Source: local data frame [9 x 4]
#
# id c d choice
# (int) (dbl) (time) (int)
# 1 1 9 <NA> 5
# 2 1 9 <NA> 6
# 3 1 9 <NA> 7
# 4 2 NA 2015-09-30 5
# 5 2 NA 2015-09-30 6
# 6 2 NA 2015-09-30 7
# 7 3 11 2015-09-29 5
# 8 3 11 2015-09-29 6
# 9 3 11 2015-09-29 7

最佳答案

您可以使用“分组”的技巧来完成使用 c() 。这使得它只能使用分组变量的预先存在的组合来完成。

library(tidyr)
dat %>% complete(c(id, c, d), choice)
id c d choice
(int) (dbl) (time) (int)
1 1 9 <NA> 5
2 1 9 <NA> 6
3 1 9 <NA> 7
4 2 NA 2015-09-30 5
5 2 NA 2015-09-30 6
6 2 NA 2015-09-30 7
7 3 11 2015-09-29 5
8 3 11 2015-09-29 6
9 3 11 2015-09-29 7

关于r - 如何使用 tidyr 填充分组变量的每个值内的完整行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32874239/

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