R - 如何为唯一组序列的缺失值添加行?
R - How to add rows for missing values for unique group sequences?
我的问题与上一个问题类似Fastest way to add rows for missing values in a data.frame?
当 min/max 因组而异时,我不知道如何添加用 "NA" 填充的行。
> red<-data.frame(project = c(6, 6, 6, 6, 6, 9, 9, 9), period =c(1, 2, 5:7, 2, 4, 5), v3=letters[1:8], v4=c("red", "yellow", recursive = T))
> red
project period v3 v4
1 6 1 a red
2 6 2 b yellow
3 6 5 c red
4 6 6 d yellow
5 6 7 e red
6 9 2 f yellow
7 9 4 g red
8 9 5 h yellow
我希望它看起来像:
project period v3 v4
6 1 a red
6 2 b yellow
6 3 NA NA
6 4 NA NA
6 5 c red
6 6 d yellow
6 7 e red
9 2 f yellow
9 3 NA NA
9 4 g red
9 5 h yellow
当我使用
library(data.table)
DT=as.data.table(red)
setkey(DT, project, period)
DT[CJ(unique(project), seq(min(period), max(period)))]
使每个项目组有7个周期;项目 6 应该有 1-7 期,但项目 9 应该有 2-5 期。
我试过 .SD[ which.max(period)], by=project]
但没有雪茄。
我认为它应该是 seq() 中的一些简单的东西,但我尝试了 seq(min(period, by=project))
但没有成功
谢谢!
DT[setkey(DT[, .(min(period):max(period)), by = project], project, V1)]
# project period v3 v4
# 1: 6 1 a red
# 2: 6 2 b yellow
# 3: 6 3 NA NA
# 4: 6 4 NA NA
# 5: 6 5 c red
# 6: 6 6 d yellow
# 7: 6 7 e red
# 8: 9 2 f yellow
# 9: 9 3 NA NA
#10: 9 4 g red
#11: 9 5 h yellow
我不知道这是否是惯用的方式,但我能够实现您想要的输出,方法是首先创建一个索引,然后根据该索引从 .SD
中子集化正确的行
DT[, indx := .GRP, project][,
.SD[CJ(unique(project), seq(min(period), max(period)))], indx]
# indx project period v3 v4
# 1: 1 6 1 a red
# 2: 1 6 2 b yellow
# 3: 1 6 3 NA NA
# 4: 1 6 4 NA NA
# 5: 1 6 5 c red
# 6: 1 6 6 d yellow
# 7: 1 6 7 e red
# 8: 2 9 2 f yellow
# 9: 2 9 3 NA NA
# 10: 2 9 4 g red
# 11: 2 9 5 h yellow
已接受的答案不再有效(不再?),但很接近。
setkey(DT,project,period)
DT[setkey(DT[, .(min(period):max(period)), by = project], project, V1)]
注意:1.需要将句号序列加入列表中才能生效。
2. @MiamiCG,我猜你需要允许笛卡尔因为没有先输入 table。如果设置为TRUE,则不会出现错误信息,但结果会不正确。
更新:@eddi 更新了他的答案以匹配我的答案,所以它正在运行。
我的问题与上一个问题类似Fastest way to add rows for missing values in a data.frame?
当 min/max 因组而异时,我不知道如何添加用 "NA" 填充的行。
> red<-data.frame(project = c(6, 6, 6, 6, 6, 9, 9, 9), period =c(1, 2, 5:7, 2, 4, 5), v3=letters[1:8], v4=c("red", "yellow", recursive = T))
> red
project period v3 v4
1 6 1 a red
2 6 2 b yellow
3 6 5 c red
4 6 6 d yellow
5 6 7 e red
6 9 2 f yellow
7 9 4 g red
8 9 5 h yellow
我希望它看起来像:
project period v3 v4
6 1 a red
6 2 b yellow
6 3 NA NA
6 4 NA NA
6 5 c red
6 6 d yellow
6 7 e red
9 2 f yellow
9 3 NA NA
9 4 g red
9 5 h yellow
当我使用
library(data.table)
DT=as.data.table(red)
setkey(DT, project, period)
DT[CJ(unique(project), seq(min(period), max(period)))]
使每个项目组有7个周期;项目 6 应该有 1-7 期,但项目 9 应该有 2-5 期。
我试过 .SD[ which.max(period)], by=project]
但没有雪茄。
我认为它应该是 seq() 中的一些简单的东西,但我尝试了 seq(min(period, by=project))
但没有成功
谢谢!
DT[setkey(DT[, .(min(period):max(period)), by = project], project, V1)]
# project period v3 v4
# 1: 6 1 a red
# 2: 6 2 b yellow
# 3: 6 3 NA NA
# 4: 6 4 NA NA
# 5: 6 5 c red
# 6: 6 6 d yellow
# 7: 6 7 e red
# 8: 9 2 f yellow
# 9: 9 3 NA NA
#10: 9 4 g red
#11: 9 5 h yellow
我不知道这是否是惯用的方式,但我能够实现您想要的输出,方法是首先创建一个索引,然后根据该索引从 .SD
中子集化正确的行
DT[, indx := .GRP, project][,
.SD[CJ(unique(project), seq(min(period), max(period)))], indx]
# indx project period v3 v4
# 1: 1 6 1 a red
# 2: 1 6 2 b yellow
# 3: 1 6 3 NA NA
# 4: 1 6 4 NA NA
# 5: 1 6 5 c red
# 6: 1 6 6 d yellow
# 7: 1 6 7 e red
# 8: 2 9 2 f yellow
# 9: 2 9 3 NA NA
# 10: 2 9 4 g red
# 11: 2 9 5 h yellow
已接受的答案不再有效(不再?),但很接近。
setkey(DT,project,period)
DT[setkey(DT[, .(min(period):max(period)), by = project], project, V1)]
注意:1.需要将句号序列加入列表中才能生效。 2. @MiamiCG,我猜你需要允许笛卡尔因为没有先输入 table。如果设置为TRUE,则不会出现错误信息,但结果会不正确。
更新:@eddi 更新了他的答案以匹配我的答案,所以它正在运行。