преобразование длинных данных с взаимно неисключающими категориями в широкий формат

#r #dplyr #data.table

#r #dplyr #данные.таблица

Вопрос:

 a1 <- data.frame(id=c(1,1,1,1,2,2,2,3,3),
                 var=c("A",NA,NA,"B","B","B",NA,NA,NA))

desired_1 <- data.frame(id=c(1,2,3),
                      A=c(T,NA,NA),
                      B=c(T,T,NA),
                      None=c(NA,NA,T))

desired_2 <- data.frame(id=c(1,1,2,3),
                        type=c("A","B","B","None"))
  

какой наиболее эффективный метод для генерации обоих desired_1 и desired_2 с использованием data.table или dplyr ?

Комментарии:

1. Ваш a1 правильный?

2. Я полагаю, что вы хотите получить desired_2 в качестве конечной цели

3. @akrun — Да, всегда можно преобразовать их в более широкую форму

Ответ №1:

Мы можем сгруппировать по ‘id’ с помощью summarise , чтобы получить ‘None’ if все элементы в ‘var’, NA или else вернуть unique элементы, отличные от NA ‘var’

 library(dplyr)
a1 %>%
   group_by(id) %>%
   summarise(var = if(all(is.na(var))) "None" else unique(var[!is.na(var)]) )
# A tibble: 4 x 2
# Groups:   id [3]
#     id var  
#  <dbl> <chr>
#1     1 A    
#2     1 B    
#3     2 B    
#4     3 None 
  

Или с помощью data.table

 library(data.table)
setDT(a1)[, .(var = if(all(is.na(var))) "None" else unique(var[!is.na(var)])), id]