繁体   English   中英

如何在R中具有字母数字范围的多列中使用ifelse来创建新列?

[英]How to use ifelse across multiple columns with alphanumeric range in R to create a new column?

我有一个包含 200 多列和 +200 万个观测值的数据集。 在这个数据集中,有 11 列(它们都以“DIAG”开头)具有字母数字类别,我想创建一个新列,如果我感兴趣的类别介于该特定范围之间,该列将收到 1,否则,0。

我尝试过这样的事情,但它不起作用:

data$GROUP_12 <- ifelse(across(contains('DIAG') >= "A15" & <= "A19", 
                 ifelse(across(contains('DIAG') >= "A50" & <= "A64", 1, 0))))

我感兴趣的范围是:A15-A19、A50-A64、A80-B09、B15-B19、B25-B34。 所以我必须对每个范围都这样做,但所有这些都被添加到 GROUP_12 列。

使用可复制的数据进行编辑:

data <- data.frame(DIAG_PRINC = c("A25", "B32", "O90"),
                   DIAG_SECUN = c("A16", "Y55", "K97"),
                   DIAGSEC1 = c("B15", "J55", "Y97"),
                   DIAGSEC2 = c("L16", "B55", "A97"),
                   DIAGSEC3 = c("W10", "S57", "T44"),
                   DIAGSEC4 = c("A64", "A16", "Y55"),
                   DIAGSEC5 = c("A80", "D33", "V12"),
                   DIAGSEC6 = c("M16", "N55", "X97"),
                   DIAGSEC7 = c("B16", "Y57", "O58"),
                   DIAGSEC8 = c("V45", "C23", "Q97"),
                   DIAGSEC9 = c("F98", "R44", "A54"))

有什么建议么?

根据提供的示例和提到的逻辑,我们可以使用if_any (如果特定行中的任何列具有值)或if_all (如果特定行中选定列中的所有列都具有值)返回TRUE/FALSE 然后用+as.integer包装以强制将逻辑转换为二进制

library(dplyr)
vals_range <- c(sprintf("A%02d", c(15:19, 50:64, 80)),
     sprintf("B%02d", c(1:9, 15:19, 25:34)))
data <- data %>% 
  mutate(GROUP_12 = +(if_any(starts_with('DIAG'), ~ .x  %in% vals_range)))

-输出

data
DIAG_PRINC DIAG_SECUN DIAGSEC1 DIAGSEC2 DIAGSEC3 DIAGSEC4 DIAGSEC5 DIAGSEC6 DIAGSEC7 DIAGSEC8 DIAGSEC9 GROUP_12
1        A25        A16      B15      L16      W10      A64      A80      M16      B16      V45      F98        1
2        B32        Y55      J55      B55      S57      A16      D33      N55      Y57      C23      R44        1
3        O90        K97      Y97      A97      T44      Y55      V12      X97      O58      Q97      A54        1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM