Суммируйте количество заданных c строк, содержащих строковые переменные в R (приветствуются коды dplyr / tidyverse) - PullRequest
0 голосов
/ 07 января 2020

У меня большой набор данных с множеством переменных, касающихся инфекционных осложнений. Есть столбцы, содержащие симптомы, записанные в виде строк в соответствующих столбцах («дизурия», «лихорадка» и др. c.). Я хотел бы знать количество положительных симптомов в каждом наблюдении. Я пытался писать разные коды, используя rowSums в mutate_at с is.character и !is.na, пытаясь сделать это проще и проще, чем одна строка кода, но это не сработало. пример:

symps_na %>% 
  mutate_if(~any(is.character(.), rowSums)) %>% 
  View()

Затем я написал код для каждого столбца отдельно, пытаясь перекодировать строковые переменные в 1, преобразовать их в цифры c и затем суммировать их, чтобы получить число симптомов (см. коды ниже).

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)))

, но столбец симптом.сумма возвращает числа вместо НС. Ой, простите, только что понял, что я пропустил na.rm=TRUE! Но все таки. Кто-нибудь может предложить более элегантный способ, как можно получить итоговое число не-NA / строковых переменных для каждого наблюдения в отдельном столбце?

1 Ответ

0 голосов
/ 08 января 2020

Вы можете создать два набора столбцов, один из которых вам нужно проверить значение, совпадающее с именем столбца, а другой - где вы должны проверить значения 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

data

Проверено на этих данных, которые выглядят следующим образом

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
...