Как создать список для всех уникальных элементов в столбце с одинаковым идентификатором в другом столбце? - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть набор данных all_transcripts, в котором у меня есть один столбец ConvID и столбец name:

>all_transcripts


ConvID  Name
    5   Guest
    5   Guest      
    5   Agent      
    5   Guest     
    5   Agent      
    6   Reception      
    6   Guest  
    6   Agent 
    6   Guest      
    6   Guest      
    7   Reception     
    7   Reception     
    7   Guest 
    7   Guest      
    7   Reception        
    8   Reception      
    8   Guest      
    8   Agent      

Я хочу получить уникальные имена для ConvID

Мой желаемый вывод выглядит так:

5 ['Guest','Agent']
6 ['Reception','Guest','Agent']
7 ['Reception','Guest']
8 ['Reception','Guest','Agent']

Для этого я попробовал агрегатную функцию следующим образом:

aggregate(interactionId~name, all_transcripts, FUN= 'unique')

Но это не работает. Как я могу изменить свой код, чтобы получить желаемый результат?

Ответы [ 2 ]

1 голос
/ 18 апреля 2019

tidyverse раствор.

Разница в том, что вложенность возвращает список-столбец в противоположность символьному векторному столбцу. В зависимости от ваших потребностей это может быть или не быть лучше.

library(tidyverse, warn.conflicts = FALSE)

all_transcripts %>%
  nest(-ConvID) %>%  
  mutate(unique_names = map(data, ~ unique(.[, "Name", drop = TRUE]))) %>%
  select(-data)
#>   ConvID            unique_names
#> 1      5            Guest, Agent
#> 2      6 Reception, Guest, Agent
#> 3      7        Reception, Guest
#> 4      8 Reception, Guest, Agent

data.table раствор

library(data.table)

setDT(all_transcripts)

all_transcripts[, .(unique_names = list(unique(Name))) , by = ConvID]
#>    ConvID          unique_names
#> 1:      5           Guest,Agent
#> 2:      6 Reception,Guest,Agent
#> 3:      7       Reception,Guest
#> 4:      8 Reception,Guest,Agent

Данные

all_transcripts <- structure(list(ConvID = c(5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 
                                             6L, 7L, 7L, 7L, 7L, 7L, 8L, 8L, 8L), Name = c("Guest", "Guest", 
                                                                                           "Agent", "Guest", "Agent", "Reception", "Guest", "Agent", "Guest", 
                                                                                           "Guest", "Reception", "Reception", "Guest", "Guest", "Reception", 
                                                                                           "Reception", "Guest", "Agent")), .Names = c("ConvID", "Name"), row.names = c(NA, 
                                                                                                                                                                        -18L), class = c("data.table", "data.frame"))
0 голосов
/ 18 апреля 2019

Предоставленное мне решение dplyr работает, но если вы хотите придерживаться aggregate, вы можете сделать следующее:

df <- tribble(
~ConvID,  ~Name,
5,   "Guest",
5,   "Guest",      
5,   "Agent",      
5,   "Guest",     
5,   "Agent",      
6,   "Reception",      
6,   "Guest", 
6,   "Agent", 
6,   "Guest",     
6,   "Guest",      
7,   "Reception",    
7,   "Reception",     
7,   "Guest",
7,   "Guest", 
7,   "Reception",       
8,   "Reception",      
8,   "Guest",      
8,   "Agent"
)

unique_m <- function(x){
  paste(unique(x), collapse = ", ")
}

df2 <- aggregate(Name~ConvID, df, FUN= 'unique_m')

df2
#>   ConvID                    Name
#> 1      5            Guest, Agent
#> 2      6 Reception, Guest, Agent
#> 3      7        Reception, Guest
#> 4      8 Reception, Guest, Agent

Вам необходимо создать другую unique функцию; в противном случае вы получите список-столбец в df2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...