如何根据 R 中的分组列数据创建具有条件值的新列?

问题描述 投票:0回答:1

我在 R 中有一个数据框,我需要根据应用于现有列的条件创建两个新列。这是数据框:

  data <- data.frame (
    ID = c(rep(91, 4), rep(92, 5), rep(95, 3), rep(90, 4)),
    time = c(1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 2, 3, 1, 2, 3, 4),
    TT = c(rep(32, 4), rep(37, 5), rep(10, 3), rep(20, 4)),
    PT = c(245, 345, 100, 273, 270, 340, 240, 170, 80, 33, 230, 50, 85, 
    100, 200, 200))

PT 列是每个 ID 在不同时间点的数值变量。我想创建两个新列,CT 和 mTT,并遵循以下规则:

CT 列:对于每一行,CT 应为 PT 和 180 中的最小值。但是,如果 ID(按时间排序)的最后一个 PT 值小于 180,则该行的 CT 应设置为 180。

mTT 列:正常情况下,mTT 应等于 TT。但如果每个 ID 的最后一个 PT 值小于 180,则该行的 mTT 应为 TT + (180 - PT)。

期望的输出如下:

result<- data.frame(
         ID = c(rep(91, 4), rep(92, 5), rep(95, 3), rep(90, 4)),
         time= c(1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 2, 3, 1, 2, 3, 4),
         TT = c(rep(32, 4), rep(37, 5), rep(10, 3), rep(20, 4)),
         PT = c(245, 345, 100, 273, 270, 340, 240, 170, 80, 33, 230, 50, 
         85, 100, 200, 200),
         CT =c(180,180,100,180,180,180,180,170,180,33,180,180,85,100,
         180,180),
         mTT= c(rep(32, 4), rep(37, 4),137, rep(10, 2),140, rep(20, 4)))

如何在 R 中实现此逻辑,最好使用 dplyr?”

r dplyr
1个回答
0
投票
library(dplyr)

data %>%
  mutate(time_n=max(time), .by=ID) %>%
  rowwise() %>%
  mutate(CT=ifelse(time==time_n & PT<180, 180, min(180, PT)),
         mTT=ifelse(time==time_n & PT<180, TT + (180 - PT), TT)) %>%
  select(-time_n) %>%
    ungroup()

给予

# A tibble: 16 × 6
      ID  time    TT    PT    CT   mTT
   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1    91     1    32   245   180    32
 2    91     2    32   345   180    32
 3    91     3    32   100   100    32
 4    91     4    32   273   180    32
 5    92     1    37   270   180    37
 6    92     2    37   340   180    37
 7    92     3    37   240   180    37
 8    92     4    37   170   170    37
 9    92     5    37    80   180   137
10    95     1    10    33    33    10
11    95     2    10   230   180    10
12    95     3    10    50   180   140
13    90     1    20    85    85    20
14    90     2    20   100   100    20
15    90     3    20   200   180    20
16    90     4    20   200   180    20
© www.soinside.com 2019 - 2024. All rights reserved.