R:如果字段不为空,请将特定列的下两行添加到总

时间:2016-08-12 13:44:22

标签: r grouping

我原本试图在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中的值。

我的技能无法解决这类问题,所以任何帮助都会很棒。谢谢!

1 个答案:

答案 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")