我正在使用一个大型数据框架,其中每行是研究参与者,其中20列是他们所开药物的代码。这里是一个例子,但在我的数据中,每行可以填写多达20个ATC_code列。
dset <- data.frame("studynr" = c(1:10),
"ATC_code1" = c("B05XA02", "L01XC07", "B01AC05", "B01AE07", "C02AB01",
"C03BA10", "C03BA11", " J01CF05", "R03DA11", "R06AE07"),
"ATC_code2" = c("V03AE07", "N06AB04", "N06AB10", "N06BX18", "H02AB09",
"G04CB01", "C10AA01", "C08DA01", "C07AA07", "B01AA03"))
studynr ATC_code1 ATC_code2
1 1 B05XA02 V03AE07
2 2 L01XC07 N06AB04
3 3 B01AC05 N06AB10
4 4 B01AE07 N06BX18
5 5 C02AB01 H02AB09
6 6 C03BA10 G04CB01
7 7 C03BA11 C10AA01
8 8 J01CF05 C08DA01
9 9 R03DA11 C07AA07
10 10 R06AE07 B01AA03
我有一个很大的药物列表,我想从我的分析中排除,因此用NA替换数据中所有出现的药物。在某些情况下,我想排除entre药物类别(因此一些排除代码只是完整药物代码的开始)。这里有一个小例子(我的排除列表大约有500个代码长):
exclude <- c("^C03", "^B05XA02", "^C07A", "^J")
我如何一次性将所有20个ATC列中出现的所有排除码替换为NA?
我已经尝试了几种不同的方法来让这个工作。这是我最新的尝试,似乎已经创造了成千上万的tibles。
exclude_fx <- function(x) replace_with_na(dset, replace = list(. = exclude))
dset <- apply(dset, 1, exclude_fx)
2条答案
按热度按时间e4yzc0pl1#
因为你的
exclude
向量已经包含了字符串开头的正则表达式(^
),所以你可以折叠整个向量,用|
来分隔各个字符串,这样我们就可以用grepl
来检查列中的字符串。将操作 Package 在
across(starts_with("ATC"))
中,以作用于列名以“ATC”开头的所有列。然后一个简单的ifelse
将NA
分配给匹配exclude
的值。由于有些字符串有白色,所以我在匹配字符串时使用
trimws
删除了它们。nfzehxib2#
用于清除多个NA值的功能
https://github.com/tidyverse/dplyr/issues/1972