我有一个大数据集,其中包含有关感染并发症的各种变量。有列,包含相应列中以字符串形式写的症状("排尿困难","发烧"等(。我想知道每个观察结果中阳性症状的数量。我尝试编写不同的代码,在mutate_at
中使用rowSums
与is.character
和!is.na
,试图做得更简单,短至一行代码,但没有奏效。 例:
symps_na %>%
mutate_if(~any(is.character(.), rowSums)) %>%
View()
然后,我分别为每列编写了一个代码,尝试将字符串变量重新编码为 1,将它们转换为数字,然后将这些变量相加以得到症状的数量(请参阅下面的代码(。
symps_na<-
pb_table_ord %>%
select(ID, dysuria:fever)%>%
mutate(dysuria=ifelse(dysuria=="Dysuria", 1, dysuria)) %>%
mutate(frequency=ifelse(frequency=="Frequency", 1, frequency)) %>%
mutate(urgency=ifelse(urgency=="Urgency", 1, urgency)) %>%
mutate(prostatepain=ifelse(prostatepain=="Prostate pain", 1, prostatepain)) %>%
mutate(rigor=ifelse(!is.na(rigor), 1, rigor)) %>%
mutate(loinpain=ifelse(!is.na(loinpain), 1, loinpain)) %>%
mutate(fever=ifelse(!is.na(fever), 1, fever)) %>%
mutate_at(vars(dysuria:fever), as.numeric) %>%
mutate(symptoms.sum=rowSums(select(., dysuria:fever)))
但症状.sum列返回的是 NA 而不是数字。 哦,对不起,刚刚意识到我错过了na.rm=TRUE
!但无论如何。谁能建议一种更优雅的方法,如何在单独的列中获取每个观察的非 NA/字符串变量的摘要数?
您可以创建两组列,一组需要检查与列名相同的值,另一组需要检查NA
值。我创建了一个在答案末尾共享的示例数据,两个向量cols1
这是列名称的向量,其值与其列和cols2
中的值相同,我们需要检查NA
值。您可以根据您拥有的列名称进行更改。
library(dplyr)
cols1 <- c('b', 'c')
cols2 <- c('d')
purrr::imap_dfc(df %>% select(cols1), `==`) %>% mutate_all(as.numeric) %>%
bind_cols(df %>% transmute_at(vars(cols2), ~+(!is.na(.)))) %>%
mutate(symptoms.sum = rowSums(select(., b:d), na.rm = TRUE))
# A tibble: 5 x 4
# b c d symptoms.sum
# <dbl> <dbl> <int> <dbl>
#1 1 1 0 2
#2 0 1 1 2
#3 1 0 1 2
#4 NA NA 1 1
#5 1 NA 0 1
数据
在此数据上进行了测试,如下所示
df <- structure(list(a = 1:5, b = structure(c(1L, 2L, 1L, NA, 1L), .Label = c("b",
"c"), class = "factor"), c = structure(c(1L, 1L, 2L, NA, NA), .Label = c("c",
"d"), class = "factor"), d = c(NA, 1, 2, 4, NA)), class = "data.frame",
row.names = c(NA, -5L))
df
# a b c d
#1 1 b c NA
#2 2 c c 1
#3 3 b d 2
#4 4 <NA> <NA> 4
#5 5 b <NA> NA