有条件地复制数据框中的行

时间:2018-03-09 00:43:46

标签: r for-loop dataframe dplyr replicate

这是我的数据集的示例:

   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)
    )

如您所见,第1天城市B和C的计数数据缺失。我想要做的是将城市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循环,但我觉得应该有一个更简单的方法。我的想法是计算每天的观察数量,然后在观察数量小于数据集中城市数量的日子里,我会复制该行以完成当天的数据。有更好的想法吗?还是更有效的循环?感谢。

1 个答案:

答案 0 :(得分:2)

使用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)
)