我正在尝试在我的df的新列中应用简单的除法。条件是,当代码在type列上找到std标志时,使用此数字除以isoprene_area列,直到找到下一个std值为止。主要问题是标志之间没有模式,所以我不知道如何获得所需的东西。
这是我的df。它大约有15000行。
tft type isoprene_area
466 2019-01-25 05:27:00 sample 4
467 2019-01-25 06:43:00 std 8
468 2019-01-25 08:02:00 blnk 1
469 2019-01-25 09:12:00 sample 1
470 2019-01-25 10:17:00 sample 1
471 2019-01-25 11:20:00 sample 1
这是我期望得到的输出
tft type isoprene_area result
466 2019-01-25 05:27:00 sample 4 NA
467 2019-01-25 06:43:00 std 8 1
468 2019-01-25 08:02:00 blnk 1 .12
469 2019-01-25 09:12:00 sample 1 .12
470 2019-01-25 10:17:00 sample 1 .12
471 2019-01-25 11:20:00 sample 1 .12
466 2019-01-25 05:27:00 sample 1 .12
467 2019-01-25 06:43:00 std 2 1
468 2019-01-25 08:02:00 blnk 1 .5
469 2019-01-25 09:12:00 sample 1 .5
470 2019-01-25 10:17:00 sample 1 .5
471 2019-01-25 11:20:00 sample 1 .5
答案 0 :(得分:0)
我们可以使用ave
,方法是在每次遇到"std"
值时创建组,然后将整个组除以该组中的std
值。
df$result <- with(df, isoprene_area/ave(isoprene_area,
cumsum(type == "std"), FUN = function(x) x[1]))
df
# tft type isoprene_area result
#1 2019-01-2505:27:00 sample 4 1.000
#2 2019-01-2506:43:00 std 8 1.000
#3 2019-01-2508:02:00 blnk 1 0.125
#4 2019-01-2509:12:00 sample 1 0.125
#5 2019-01-2510:17:00 sample 1 0.125
#6 2019-01-2511:20:00 sample 1 0.125
#7 2019-01-2505:27:00 sample 1 0.125
#8 2019-01-2506:43:00 std 2 1.000
#9 2019-01-2508:02:00 blnk 1 0.500
#10 2019-01-2509:12:00 sample 1 0.500
#11 2019-01-2510:17:00 sample 1 0.500
#12 2019-01-2511:20:00 sample 1 0.500
如果您想要NA
到第一个std
值,我们可以做
df$result[1 : (which.max(df$type == "std") - 1)] <- NA
或与dplyr
library(dplyr)
df %>%
group_by(group = cumsum(type == "std")) %>%
mutate(result = isoprene_area/first(isoprene_area))