我想从一个dataframe中减去行块,然后进行更多的计算。例如,我希望在每个grp变量中减去与以下条件相匹配的行块:
df <- tribble(
~grp, ~time, ~val,
"A", 1, 1,
"A", 2, -0.3,
"A", 3, -0.4,
"A", 5, 0.5,
"A", 7, -0.1,
"A", 9, 0.9,
"B", 1, -0.1,
"B", 2, -0.4,
"B", 3, 0.3,
"B", 5, 0.1,
"B", 7, 0.4,
"B", 9, -0.1
)根据上述标准,我们希望得到以下数据框架:
result <- tribble(
~grp, ~time, ~val,
"A", 2, -0.3,
"A", 3, -0.4,
"A", 5, 0.5,
"A", 7, -0.1,
"A", 9, 0.9,
"B", 1, -0.1,
"B", 2, -0.4,
"B", 3, 0.3
)利用结果数据框架,可以计算出从负到正的状态转换时间。
final <- tribble(
~grp, ~tran_time,
"A", (5-2) + (9-7),
"B", 3-1
)我可以编写循环来实现这些目标,但是可以使用矢量化方法来实现上述目标吗?
发布于 2022-10-12 11:31:54
使用您的逻辑,我们可以使用slice
library(dplyr)
df1 <- df |>
slice(which.max((val < 0 & time == 1) | (val < 0 & lag(val) > 0)):max(which(lag(val) < 0 & val > 0)))
grp time val
<chr> <dbl> <dbl>
1 A 2 -0.3
2 A 3 -0.4
3 A 5 0.5
4 A 7 -0.1
5 A 9 0.9
6 B 1 -0.1
7 B 2 -0.4
8 B 3 0.3您可以使用count和add_count而不是group_by来总结转换时间。
df2 <- df1 |>
add_count(a = ifelse(val < 0, cumsum(val > 0) + 1, cumsum(val > 0)), wt = max(time) - min(time)) |>
count(grp, wt = sum(unique(n)), name = "trans_time")
grp trans_time
<chr> <dbl>
1 A 5
2 B 2https://stackoverflow.com/questions/74039767
复制相似问题