有条件地复制数据框中的行
conditionally duplicating rows in a data frame
这是我的数据集样本:
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 循环来完成它,但我觉得应该有更简单的方法来完成它。我的想法是计算每天的观察次数,然后对于观察次数少于数据集中城市数量的日子,我将复制该行以完成当天的数据。有更好的主意吗?还是更高效的 for 循环?谢谢
有了dplyr
和tidyr
,我们可以做:
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")
两个return:
# 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)
)
这是我的数据集样本:
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 循环来完成它,但我觉得应该有更简单的方法来完成它。我的想法是计算每天的观察次数,然后对于观察次数少于数据集中城市数量的日子,我将复制该行以完成当天的数据。有更好的主意吗?还是更高效的 for 循环?谢谢
有了dplyr
和tidyr
,我们可以做:
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")
两个return:
# 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)
)