【发布时间】:2021-10-25 18:59:37
【问题描述】:
我有一个如下所示的数据集:
(可视化下面的数据集可能有助于您理解问题)
original <- data.frame(
ID = c(rep("John", 3), "Steve"),
A = c(rep(3, 3), 1),
B = c(rep(4, 3), 2),
b = c(2, 3, 2, 2),
detail = c(rep("GOOOOD", 4))
)
变量A、B 和b 中的值都是整数。变量b 在这个数据集中是不完整的,它实际上有从1 到B 的值。
我需要添加一个新变量a 来完成这个数据集,完成的数据集将如下所示:
completed1 <- data.frame(
ID = c(rep("John", 12), rep("Steve", 2)),
A = c(rep(3, 12), rep(1, 2)),
a = c(rep(1, 4), rep(2, 4), rep(3, 4), rep(1, 2)),
B = c(rep(4, 12), rep(2, 2)),
b = c(rep(1:4, 3), 1, 2),
detail = c(NA, "GOOOOD", "GOOOOD", NA, NA, "GOOOOD", rep(NA, 7), "GOOOOD")
)
变量a 中的值也是整数,a 的值从 1 到 A 的值。 b 中的值嵌套在a 的每个值中,a 中的值嵌套在ID 的每个因子中。
我认为以这种方式完成数据集最相关的函数是tidyr::complete()和tidyr::expand(),但它们只能完成现有变量中的值组合,不能添加新列(变量)。
我知道挑战在于有多个位置可以在 detail 对应于新添加的值 a 通过嵌套关系,例如完成的数据集也可以是这样的:
completed2 <- data.frame(
ID = c(rep("John", 12), rep("Steve", 2)),
A = c(rep(3, 12), rep(1, 2)),
a = c(rep(1, 4), rep(2, 4), rep(3, 4), rep(1, 2)),
B = c(rep(4, 12), rep(2, 2)),
b = c(rep(1:4, 3), 1, 2),
detail = c(NA, "GOOOOD", rep(NA, 4), "GOOOOD", NA, NA, "GOOOOD", rep(NA, 3), "GOOOOD")
)
detail 中的值在完整数据集中的位置对我来说并不重要。我的实际数据集有超过 40,000 行,所以我真的需要一些东西来自动化它。
可以这样做吗? 非常感谢!!!
【问题讨论】: