我有一個包含 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"))
有什么建議么?
uj5u.com熱心網友回復:
根據提供的示例和提到的邏輯,我們可以使用if_any(如果特定行中的任何列具有值)或if_all(如果特定行中選定列中的所有列都具有值)回傳TRUE/FALSE。然后用 or換行以as.integer將邏輯強制轉換為二進制
library(dplyr)
vals_range <- c(sprintf("Ad", c(15:19, 50:64, 80)),
sprintf("Bd", 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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/482607.html
