基于附加列R中的值的子集列

2ic8powd  于 2023-10-13  发布在  其他
关注(0)|答案(3)|浏览(130)

我有一个DF:

  1. df1 <- data.frame(ID = c('a', 'b', 'c', 'c1', 'd', 'e', 'f', 'g', 'h', 'h1'),
  2. T_10_12 = c(11, 15, 14, 14, 13, 16, 15, 12, 11, 12),
  3. T_12_14 = c(12, 16, 16, 16, 14, 17, 16.5, 13, 12, 12),
  4. T_14_16 = c(13, 18, 17.5, 16.5, 15, 18, 17.2, 13, 13, 14),
  5. T_out = c(10.5, 12.3, 14.5, 15.1, 15, 13, 12, 13, 13, 14))

我希望对列'T_10_12'、'T_12_14'、'T_14_16'进行子集化,以便每行只取一个值。从中选择值的列由列“T_out”中的数字指定。如果'T_out'= 10.5,则来自T_10_12的值被分配给新变量'T_in'。如果“T_out”= 14.5,则“T_14_16”中的值被分配给“T_in”。输出应该如下所示:

  1. ID T_in T_out
  2. 1 a 11.0 10.5
  3. 2 b 16.0 12.3
  4. 3 c 17.5 14.5
  5. 4 c1 16.5 15.1
  6. 5 d 15.0 15.0
  7. 6 e 17.0 13.0
  8. 7 f 15.0 12.0
  9. 8 g 16.5 13.0
  10. 9 h 13.0 13.0
  11. 10 h1 14.0 14.0
q5iwbnjs

q5iwbnjs1#

我们可以使用case_when

  1. library(dplyr)
  2. df1 %>%
  3. mutate(T_in = case_when(
  4. T_out == 10.5 ~ T_10_12,
  5. T_out >= 10.5 & T_out < 12.5 ~ T_10_12,
  6. T_out >= 12.5 & T_out < 14.5 ~ T_12_14,
  7. .default = T_14_16
  8. )) %>%
  9. select(ID, T_in, T_out)
  1. ID T_in T_out
  2. 1 a 11.0 10.5
  3. 2 b 15.0 12.3
  4. 3 c 17.5 14.5
  5. 4 c1 16.5 15.1
  6. 5 d 15.0 15.0
  7. 6 e 17.0 13.0
  8. 7 f 15.0 12.0
  9. 8 g 13.0 13.0
  10. 9 h 12.0 13.0
  11. 10 h1 12.0 14.0
展开查看全部
7fhtutme

7fhtutme2#

使用findInterval的基本R选项(因为您可以在列名中使用1214来对T_out中的值的区间进行分类)

  1. transform(
  2. df1,
  3. T_in = df1[-1][cbind(
  4. seq_along(T_out),
  5. findInterval(T_out, c(12, 14)) + 1
  6. )]
  7. )[c("ID", "T_in", "T_out")]

  1. ID T_in T_out
  2. 1 a 11.0 10.5
  3. 2 b 16.0 12.3
  4. 3 c 17.5 14.5
  5. 4 c1 16.5 15.1
  6. 5 d 15.0 15.0
  7. 6 e 17.0 13.0
  8. 7 f 16.5 12.0
  9. 8 g 13.0 13.0
  10. 9 h 12.0 13.0
  11. 10 h1 14.0 14.0
展开查看全部
js5cn81o

js5cn81o3#

根据cur_column中的值检查条件的通用方法

  1. library(dplyr)
  2. library(stringr)
  3. df %>%
  4. reframe(
  5. ID,
  6. T_in = rowSums(across(matches("T_\\d+"), ~
  7. if_else(as.numeric(str_extract(cur_column(), "T_(\\d+)", 1)) < T_out &
  8. as.numeric(str_extract(cur_column(), "(\\d+)$", 1) >= T_out), .x, 0))),
  9. T_out)

输出

  1. ID T_in T_out
  2. 1 a 11.0 10.5
  3. 2 b 16.0 12.3
  4. 3 c 17.5 14.5
  5. 4 c1 16.5 15.1
  6. 5 d 15.0 15.0
  7. 6 e 17.0 13.0
  8. 7 f 15.0 12.0
  9. 8 g 13.0 13.0
  10. 9 h 12.0 13.0
  11. 10 h1 12.0 14.0
展开查看全部

相关问题