gpt4 book ai didi

r - 使用合并创建空白行

转载 作者:行者123 更新时间:2023-12-04 10:54:20 27 4
gpt4 key购买 nike

我正在使用相同的输入参数运行多个模拟。有些模拟比其他模拟更早完成,我需要扩展较短模拟的结果,以便我可以分析包含所有运行的数据。这意味着用重复的最终值填充“短”运行,直到它们与具有相同输入参数的“长”运行的长度相同。

我想要一个 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/

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