我希望能够按组为每一行进行简单的计算,但是我需要参考符合特定条件的以前的行。我想创建一个新变量results
。对于每个组中的每一行,我想找到最接近当前行上方的满足tag == "Y"
且code
不为NA
的行。然后,我想使用该行中的value
,并将其乘以当前行中的值。
最小化示例
df <- structure(list(name = c("apples", "apples", "apples", "apples",
"oranges", "oranges", "oranges", "oranges"),
id = 1:8,
tag = c("X", "Y", "Y", "X", "X", "Y", "X", "X"),
code = c(1, 1, NA, 1, NA, 1, NA, NA),
value = c(1, 11, 4, 3, 9, 5, 7, 8)),
class = "data.frame", row.names = c(NA, -8L))
name id tag code value
1 apples 1 X 1 1
2 apples 2 Y 1 11
3 apples 3 Y NA 4
4 apples 4 X 1 3
5 oranges 5 X NA 9
6 oranges 6 Y 1 5
7 oranges 7 X NA 7
8 oranges 8 X NA 8
期望输出
例如,对于第3行,满足条件的最接近的是第2行,因此将4乘以11(得到44)。对于第4行,第3行不满足条件,因此我们转到第2行,并将3乘以11(得到33)。以此类推。
name id tag code value results
1 apples 1 X 1 1 NA
2 apples 2 Y 1 11 NA
3 apples 3 Y NA 4 44
4 apples 4 X 1 3 33
5 oranges 5 X NA 9 NA
6 oranges 6 Y 1 5 NA
7 oranges 7 X NA 7 35
8 oranges 8 X NA 8 40
我猜想我需要使用cumsum
和/或fill
,但不确定如何在这里使用。如果我对前一行进行计算,则可以使用lag
,但不确定如何搜索多个上面的值。我可以使用base R、data.table
、tidyverse
或其他解决方案。
Error in fifelse(x.id < id, i.value * value, NA) : 'yes' is of type double but 'no' is of type logical. Please make sure that both arguments have the same type.
- AndrewGBNA_REAL_
。 - Waldidf$code[3] <- 1
),那么我就得不到正确的输出。例如,第3行应该是44,但是却出现了一个NA。 - AndrewGB