【问题标题】:conditionally duplicating rows in a data frame有条件地复制数据框中的行
【发布时间】:2018-08-17 12:02:42
【问题描述】:

这是我的数据集的一个样本:

   day city count
1   1    A    50
2   2    A   100
3   2    B   110
4   2    C    90

这里是重现它的代码:

  df <- data.frame(
    day = c(1,2,2,2),
    city = c("A","A","B","C"),
    count = c(50,100,110,90)
    )

如您所见,城市 B 和 C 第 1 天的计数数据缺失。我想要做的是使用城市 A 的计数作为对其他两个城市的估计。所以期望的输出是:

   day city count
1   1    A    50
2   1    B    50
3   1    C    50
4   2    A   100
5   2    B   110
6   2    C    90

我可以想出一个 for 循环来做到这一点,但我觉得应该有一个更简单的方法来做到这一点。我的想法是统计每天的观察次数,然后对于观察次数少于数据集中城市数量的日子,我会复制该行以完成当天的数据。有更好的想法吗?或更有效的for循环?谢谢。

【问题讨论】:

    标签: r for-loop dataframe dplyr replicate


    【解决方案1】:

    使用dplyrtidyr,我们可以做到:

    library(dplyr)
    library(tidyr)
    
    df %>% 
      expand(day, city) %>% 
      left_join(df) %>% 
      group_by(day) %>% 
      fill(count, .direction = "up") %>% 
      fill(count, .direction = "down")
    

    或者,我们可以使用 thelatemail 的解决方案来避免left_join

    df %>% 
      complete(day, city) %>% 
      group_by(day) %>% 
      fill(count, .direction = "up") %>% 
      fill(count, .direction = "down")
    

    两者都返回:

    # A tibble: 6 x 3
        day city  count
      <dbl> <fct> <dbl>
    1    1. A       50.
    2    1. B       50.
    3    1. C       50.
    4    2. A      100.
    5    2. B      110.
    6    2. C       90.
    

    数据(稍作修改以显示.direction 填充两个方向):

    df <- data.frame(
      day = c(1,2,2,2),
      city = c("B","A","B","C"),
      count = c(50,100,110,90)
    )
    

    【讨论】:

    • 还有complete,所以你可以这样做-complete(df, day, city) %&gt;% fill(count)
    • 不错,我喜欢那个
    • 如果您愿意,可以随意窃取它 - 没有 2 个几乎相同的答案。
    • 谢谢!在运行此之前,我是否必须根据日期和城市对数据框进行排序?
    • 嗯,不确定。您可能必须这样做,但我无法测试,因为我正要上班。如果需要排序,您可以尝试df %&gt;% group_by(day) %&gt;% arrange(city) %&gt;% complete(day, city) %&gt;% fill(count)
    猜你喜欢
    • 2014-03-01
    • 2015-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    • 2021-12-23
    • 1970-01-01
    • 2018-01-11
    相关资源
    最近更新 更多