如何用NA替换 Dataframe 多列中的多个值

kb5ga3dv  于 2023-03-27  发布在  其他
关注(0)|答案(2)|浏览(179)

我正在使用一个大型数据框架,其中每行是研究参与者,其中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)
e4yzc0pl

e4yzc0pl1#

因为你的exclude向量已经包含了字符串开头的正则表达式(^),所以你可以折叠整个向量,用|来分隔各个字符串,这样我们就可以用grepl来检查列中的字符串。
将操作 Package 在across(starts_with("ATC"))中,以作用于列名以“ATC”开头的所有列。然后一个简单的ifelseNA分配给匹配exclude的值。

library(dplyr)

dset %>% 
  mutate(across(starts_with("ATC"), 
                ~ifelse(grepl(paste(exclude, collapse = "|"), trimws(.x)), NA, trimws(.x))))

   studynr ATC_code1 ATC_code2
1        1      <NA>   V03AE07
2        2   L01XC07   N06AB04
3        3   B01AC05   N06AB10
4        4   B01AE07   N06BX18
5        5   C02AB01   H02AB09
6        6      <NA>   G04CB01
7        7      <NA>   C10AA01
8        8      <NA>   C08DA01
9        9   R03DA11      <NA>
10      10   R06AE07   B01AA03

由于有些字符串有白色,所以我在匹配字符串时使用trimws删除了它们。

nfzehxib

nfzehxib2#

用于清除多个NA值的功能
https://github.com/tidyverse/dplyr/issues/1972

na_codes <- function(x, ...) {
  x[x %in% c(...)] <- NA
  x

相关问题