我在R中有一个医疗数据框,目前可容纳700列。它还包括有关给予患者用药的信息。此信息分布在数百列中(每个类)。 问题在于,信息存储为自由文本。我想将信息更改为1和0,其中1个代码表示单元格中有文本,0表示NA,如下所示:
dat$Admission_Ace.Inhibitors..Plain <- factor(ifelse(is.na(dat$Admission_Ace.Inhibitors..Plain), 0, 1))
但是,尽管此解决方案效果很好,但一次只能处理一列,而我需要重新编码数百个。 到目前为止,我还没有成功地使假肢自动化。你能帮我吗?
注意:我有一个向量,其中包含所有需要使用此方法更改的列名:
admission <- names(dat)[grepl("Admission", names(dat), ignore.case = T )]
答案 0 :(得分:3)
在基数R中,使用lapply
:
dat[admission] <- lapply(dat[admission], function(x) +(!is.na(x)))
在dplyr
中使用mutate_at
:
library(dplyr)
dat %>% mutate_at(vars(admission), ~+(!is.na(.)))
is.na
检查NA
值,!
取反,+
将TRUE
/ FALSE
值转换为1
/ 0
。
使用可复制的示例,
dat <- data.frame(a = c(1, 2, 3, NA), b =c(NA, NA, 3, 2))
dat[] <- lapply(dat, function(x) +(!is.na(x)))
dat
# a b
#1 1 0
#2 1 0
#3 1 1
#4 0 1