我在 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?”
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