r语言 - 用虚拟零填充时间序列数据框



我想这是一个非常简单的问题,无论如何我都无法理解它。

考虑以下数据框:

df <- data.frame(            
week = c(1,1,1,2,3,3,3),     
id = c(12,13,14,12,12,13,14),
x = sample(c(100:200), 7))   
df                           
#>   week id   x
#> 1    1 12 126
#> 2    1 13 166
#> 3    1 14 129
#> 4    2 12 128
#> 5    3 12 136
#> 6    3 13 120
#> 7    3 14 115

我想为第 2 周的x创建一个虚拟值 0 或NA,其中没有第 13id和 14 的观测值。换句话说:这样第 2 周id13 和 14x = 0。最好用dplyr.

关于如何做到这一点的任何想法?

尽管这个问题被标记为重复group by但实际上并不需要。 此外,我们还添加了动物园和几个基本答案。

1( 完成(整理(complete在整理中:

library(tidyr)
complete(DF, week, id)

给:

# A tibble: 9 x 3
week    id     x
<int> <int> <int>
1     1    12   126
2     1    13   166
3     1    14   129
4     2    12   128
5     2    13    NA
6     2    14    NA
7     3    12   136
8     3    13   120
9     3    14   115

2( read.zoo/fortify.zoo (zoo(创建一个每周拆分的动物园对象,然后使用melt=TRUE将其转换回 data.frame:

library(zoo)
z <- read.zoo(DF, index = "id", split = "week")
fortify.zoo(z, melt = TRUE, names = names(DF)[c(2:1, 3)])

给:

id week   x
1 12    1 126
2 13    1 166
3 14    1 129
4 12    2 128
5 13    2  NA
6 14    2  NA
7 12    3 136
8 13    3 120
9 14    3 115

3(重塑(基底(重塑为宽形式,然后恢复为长形式:

wide <- reshape(DF, idvar = "week", timevar = "id", dir = "wide")
long <- reshape(wide, dir = "long")
names(long) <- names(DF)

4( tapply/as.data.frame.table (base(

as.data.frame.table(tapply(DF[[3]], DF[-3], c), responseName = names(DF)[3])

5( 展开网格/合并(基础(

with(DF, merge(expand.grid(week = unique(week), id = unique(id)), DF, all = TRUE))

最新更新