r - 使用合并创建空白行

标签 r dplyr

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

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

相关文章:

删除只有零的行

r - 嵌套整齐模型并在 ggplot 中绘制 abline

r - 从所有后续行中减去第一行

r - 通过计算另一个中的表达式来创建一个新列

r - Sarima 仅显示地 block

r - tidyverse 计算每行跨多列的排名

r - 使用separate() 分割日期

r - 有条件地将数据框中的值更改为其列名

r - 针织/rmarkdown/ latex : How to cross-reference figures and tables?

r - ggplot 标题不起作用?