我想这是一个非常简单的问题,无论如何我都无法理解它。
考虑以下数据框:
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 周id
13 和 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))