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

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

正如您所看到的,城市 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 循环来做到这一点,但我觉得应该有一种更简单的方法来做到这一点。我的想法是统计每天的观测数,然后对于观测数少于数据集中城市数的那几天,我将复制该行以完成当天的数据。还有更好的想法吗?或者更有效的 for 循环?谢谢。

最佳答案

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

关于r - 有条件地复制数据框中的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49184893/

相关文章:

python - 循环元组并获取从高到低的转换列表的更有效方法

r - 在 poLCA R 包中寻找最佳 LCA 模型

r - 根据其他列的条件提取数据帧行的子集

r - 根据其他列中的值条件跨数据框中的列应用 if else 语句

r - 合并 R 中具有 NA 值的特定行

python - 如何在 R 或 Python 中制作 3d(4 变量)三元(金字塔)图?

mysql - 在 R 中用查询替换表达式参数

java - 我如何让一系列球队互相比赛一次并且只比赛一次?

scala - 如何将数据帧转换为 JSON 并使用 key 写入 kafka 主题

python - 如何将数据框字符串列拆分为多列?