繁体   English   中英

如何为在另一列中共享相同ID的列中的所有唯一元素创建列表?

[英]How to create a list for all unique elements in a column that share the same ID in another column?

我有一个数据集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')

但这是行不通的。 如何更改代码,以便获得所需的输出?

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

所提供的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获得一个列表列。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM