Как суммировать категориальную переменную с отсутствующими данными? - PullRequest
5 голосов
/ 04 марта 2020

Я пытаюсь выполнить суммирование group_by по категориальной переменной, за оценку слабости. Данные структурированы таким образом, что для каждого субъекта имеется несколько наблюдений, некоторые из которых содержат недостающие данные, например:

Subject  Frailty
1        Managing well
1        NA
1        NA
2        NA
2        NA
2        Vulnerable
3        NA
3        NA
3        NA

Я бы хотел, чтобы данные были обобщены таким образом, чтобы при наличии одного из них появлялось краткое описание, и NA, если нет, например,

Subject  Frailty
1        Managing well
2        Vulnerable 
3        NA

Я попробовал следующие два подхода, которые оба вернули ошибки:

Mode <- function(x) {
ux <- na.omit(unique(x[!is.na(x)]))
tab <- tabulate(match(x, ux)); ux[tab == max(tab)]
}

data %>% 
group_by(Subject) %>% 
summarise(frailty = Mode(frailty)) %>% 

Error: Expecting a single value: [extent=2].
condense <- function(x){unique(x[!is.na(x)])}

data %>% 
group_by(subject) %>% 
summarise(frailty = condense(frailty))

Error: Column frailty must be length 1 (a summary value), not 0

Ответы [ 2 ]

3 голосов
/ 04 марта 2020

Одно решение с участием dplyr может быть:

df %>%
 group_by(Subject) %>%
 slice(which.min(is.na(Frailty)))

  Subject Frailty      
    <int> <chr>        
1       1 Managing_well
2       2 Vulnerable   
3       3 <NA>        
2 голосов
/ 04 марта 2020

Если имеется только один элемент без NA, то после группировки по 'Subject' получите первый элемент без NA

library(dplyr)
data %>%
   group_by(Subject) %>%
   summarise(Frailty = Frailty[which(!is.na(Frailty))[1]])
# A tibble: 3 x 2
#  Subject Frailty      
#    <int> <chr>        
#1       1 Managing well
#2       2 Vulnerable   
#3       3 <NA>       

Если имеется более одного уникального элемента без NA либо мы paste их вместе, либо возвращаем как list

data %>%
    group_by(Subject) %>%
    summarise(Frailty = na_if(toString(unique(na.omit(Frailty))), ""))
# A tibble: 3 x 2
#  Subject Frailty      
#    <int> <chr>        
#1       1 Managing well
#2       2 Vulnerable   
#3       3 <NA>      

data

data <- structure(list(Subject = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L
), Frailty = c("Managing well", NA, NA, NA, NA, "Vulnerable", 
NA, NA, NA)), class = "data.frame", row.names = c(NA, -9L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...