【问题标题】:R Dplyr: Adding Missing Rows into Gaps in a Column of IntegersR Dplyr:将缺失的行添加到整数列的间隙中
【发布时间】:2021-06-04 23:02:02
【问题描述】:

我正在使用 R 中的 dplyr 包来“总结”一些输入数据。

第 1 步:计算给定日期 (Date) 的记录数 (N),除了 A 列中的另一个分类值之外,还有某个索引值 (Idx)。 p>

T <- orig_data %>% group_by(A, Date, Idx) %>% summarise(N=n())

第 2 步:创建一个给定日期与给定 Idx 值或更高的计数的累积总和。

T2 <- T %>% mutate(cN=cumsum(N))

但是,表中不存在介于其最大值和最小值之间的某些 Idx 值,例如下面的示例中缺少 idx=10。

A   Date        Idx N   cN
N   2020-10-01  8   18  85
N   2020-10-01  9   6   91
N   2020-10-01  11  1   92
N   2020-10-01  13  10  102

我想为每个缺失的 Idx 值添加一行,例如在缺失的每一天,例如

N   2020-10-01  10  0   91  

我尝试使用最简单的填充函数版本进行尝试,但结果没有明显变化(可能是因为 Idx 被解释为列表而不是向量?)

T3 <- T2 %>% fill(cN)

有没有办法轻松添加上面的行,并识别任何其他缺失的行并将它们添加到表中?

【问题讨论】:

    标签: r dplyr tidyr


    【解决方案1】:

    使用tidyr 的函数的解决方案:completenesting。我看到你在另一篇文章中评论说你已经尝试过complete 函数,但它很慢。试试nesting 列看看是否有帮助。

    library(dplyr)
    library(tidyr)
    
    dat2 <- dat %>%
      complete(nesting(A, Date), Idx = full_seq(Idx, period = 1), fill = list(N = 0)) %>%
      fill(cN)
    dat2
    # # A tibble: 6 x 5
    #   A     Date         Idx     N    cN
    #   <chr> <chr>      <dbl> <dbl> <int>
    # 1 N     2020-10-01     8    18    85
    # 2 N     2020-10-01     9     6    91
    # 3 N     2020-10-01    10     0    91
    # 4 N     2020-10-01    11     1    92
    # 5 N     2020-10-01    12     0    92
    # 6 N     2020-10-01    13    10   102
    

    【讨论】:

    • 这行得通,即它运行额外的步骤几乎和原来的一样快。使用“full_seq”函数来帮助查找缺失的 Idx 值是我最初尝试中缺失的关键元素之一。
    【解决方案2】:

    我找到的最佳解决方案(我之前遇到过同样的问题)是创建一个替代数据框,其中包括我关心的完整序列。然后,我将我真实的主要数据集加入到那个替身中。

    这有点hacky,但只需几行就可以完成。它还会产生感兴趣的结果。

    library(dplyr)
    
    df <- data.frame(idx = c(8, 9, 11, 12), n = c(11, 22, 33, 44)) %>% 
      left_join(
        x = data.frame(idx = seq(min(.$idx), max(.$idx))),
        y = .)
    
    df
    

    输出:

      idx  n
    1   8 11
    2   9 22
    3  10 NA
    4  11 33
    5  12 44
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-02
      • 1970-01-01
      • 2018-06-19
      • 1970-01-01
      • 2021-08-11
      相关资源
      最近更新 更多