问题描述
df <- data.frame(week = factor(c(1,2,49,50)),occurrences = c(1,4,3))
week occurrences
1 1 1
2 2 4
3 49 2
4 50 3
我想为 (1-53) 中所有“缺失”周添加因子,相应的出现次数值为 0。这样做的最佳方法是什么?我必须对可能不会“丢失”相同因素的几个数据框执行此操作,因此我想将其概括为一个函数。
解决方法
您可以使用 rbind()
将必要的行附加到您的 df
,在本示例中,为了清楚起见,我首先创建要添加的 df,然后再附加它。 setdiff()
将返回当前不在您的周列中的数字:
df_to_app = data.frame(week = factor(setdiff(1:52,df$week)),occurrences = 0)
df = rbind(df,df_to_app)
希望能帮到你!
,这是使用 tidyr::complete
的方法。首先,我们需要向 week
列添加额外的级别。我们可以使用 forcats::fct_expand
。然后 tidyr::complete
将用这些级别填充 data.frame,我们可以使用 fill =
参数来指示我们想要 0
。
library(tidyverse)
df %>%
mutate(week = fct_expand(week,paste0(1:52))) %>%
complete(week,fill = list(occurrences = 0))
# A tibble: 52 x 2
week occurrences
<fct> <dbl>
1 1 1
2 2 4
3 49 2
4 50 3
5 3 0
6 4 0
7 5 0
8 6 0
9 7 0
10 8 0
# … with 42 more rows
或者正确连接到包含所有周的数据框:
library(dplyr)
df %>%
right_join(data.frame(week = as.factor(1:52))) %>%
mutate(occurrences = replace_na(occurrences,0))