我原本试图在Teradata SQL中这样做,但我意识到我也有R可供我使用。我觉得R中可能有更普遍的答案。
ID TOTAL QTY
111 NULL 100
112 NULL 150
113 312.00 70
114 NULL 200
115 14.00 40
116 NULL 70
117 NULL 100
118 NULL 170
在上面的数据中,我想创建一个名为THREEDAY的新列。如果TOTAL为null,那么我希望THREEDAY等于QTY中的金额。但是,如果TOTAL不为null,我希望TOTAL等于QTY 加中的数量,以用于以下两行的QTY数量。例如:
ID TOTAL QTY THREEDAY
111 NULL 100 100
112 NULL 150 150
113 312.00 70 310
114 NULL 200 200
115 14.00 40 210
116 NULL 70 70
117 NULL 100 100
118 NULL 170 170
对于ID 113,THREEDAY中的金额为310(70 + 200 + 40),而对于ID 115,金额为210(40 + 70 + 100)。对于其余的ID,THREEDAY中的金额等于QTY,因为缺少TOTAL中的值。
我的技能无法解决这类问题,所以任何帮助都会很棒。谢谢!
答案 0 :(得分:1)
我们可以使用base R
方法。正如OP所评论的那样," NULL"在NA
中为R
,在' TOTAL'中获取非NA元素的数字索引。 (' i1'),创建' THREEDAY'作为' QTY'的副本列,循环' i1',将元素子集在' QTY'对于从该索引到下两个索引的序列,获取sum
并将这些值分配给' THREEDAY'对于' i1'位置。
i1 <- which(!is.na(df1$TOTAL))
df1$THREEDAY <- df1$QTY
df1$THREEDAY[i1] <- sapply(i1, function(i) sum(df1$QTY[i:(pmin(nrow(df1), (i+2)))]))
df1
# ID TOTAL QTY THREEDAY
#1 111 NA 100 100
#2 112 NA 150 150
#3 113 312 70 310
#4 114 NA 200 200
#5 115 14 40 210
#6 116 NA 70 70
#7 117 NA 100 100
#8 118 NA 170 170
df1 <- structure(list(ID = 111:118, TOTAL = c(NA, NA, 312, NA, 14, NA,
NA, NA), QTY = c(100L, 150L, 70L, 200L, 40L, 70L, 100L, 170L)),
.Names = c("ID",
"TOTAL", "QTY"), row.names = c(NA, -8L), class = "data.frame")