如何基于另一列的条件在列中应用操作

时间:2019-05-01 06:00:03

标签: r

我正在尝试在我的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

1 个答案:

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