我正在使用相同的输入参数运行多个模拟。有些模拟比其他模拟更早完成,我需要扩展较短模拟的结果,以便我可以分析包含所有运行的数据。这意味着用重复的最终值填充“短”运行,直到它们与具有相同输入参数的“长”运行的长度相同。
我想要一个 dplyr 解决方案,因为真实的数据集非常庞大,而且 dplyr 具有快速连接。
这是我的尝试。
library(dplyr)
sims <- data.frame("run" = c(1, 1, 1, 2, 2, 3, 3),
"type" = c("A", "A", "A", "A", "A", "B", "B"),
"step" = c(0, 1, 2, 0, 1, 0, 1),
"value" = seq(1:7))
allSteps <- data.frame("type" = c("A", "A", "A", "B", "B"),
"step" = c(0, 1, 2, 0, 1))
merged <- full_join(sims, allSteps,
by = c("type", "step"))
这得到输出:
run type step value
1 A 0 1
1 A 1 2
1 A 2 3
2 A 0 4
2 A 1 5
3 B 0 6
3 B 1 7
但我实际上想要以下内容,因为运行 2 是类型 A,因此应该扩展到与运行 1 相同的长度(也是类型 A):
run type step value
1 A 0 1
1 A 1 2
1 A 2 3
2 A 0 4
2 A 1 5
2 A 2 NA # extra line here
3 B 0 6
3 B 1 7
然后我将使用 fill 得到我想要的结果:
run type step value
1 A 0 1
1 A 1 2
1 A 2 3
2 A 0 4
2 A 1 5
2 A 2 5 # filled replacement of NA
3 B 0 6
3 B 1 7
我确定这是某个问题的重复,但我使用的各种搜索词未能找到它。
最佳答案
如果至少有一次运行包含每种类型的完整序列,我们实际上并不需要 data.frame allSteps
。相反,我们可以将 tidyr::expand()
与自连接结合使用:
library(tidyr)
sims %>% group_by(type) %>%
expand(run, step) %>%
full_join(sims, by = c("type", "step", "run")) %>%
select(2,1,3,4)
# run type step value
# <dbl> <fctr> <dbl> <int>
#1 1 A 0 1
#2 1 A 1 2
#3 1 A 2 3
#4 2 A 0 4
#5 2 A 1 5
#6 2 A 2 NA
#7 3 B 0 6
#8 3 B 1 7
关于r - 使用合并创建空白行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48684377/