【问题标题】:How to group the data by id and get unique values of all columns in R?如何按 id 对数据进行分组并获取 R 中所有列的唯一值?
【发布时间】:2020-07-26 17:38:32
【问题描述】:

我有一个包含 ID 和其他列的表。我想按 Id 对数据进行分组并获取所有列的唯一值。

从上面的表格中按 ID 分组并获得唯一的(Alt1,Alt2,Alt3)

结果应该是矢量形式
A -> 1,2,3,5
B ->1,3,4,5,7

【问题讨论】:

    标签: r dplyr data.table tidyr


    【解决方案1】:

    我们可以获取长格式的数据,并为每个 ID 创建一个 unique 值列表。

    library(dplyr)
    library(tidyr)
    
    df1 <- df %>%
      pivot_longer(cols = -ID) %>%
      group_by(ID) %>%
      summarise(value = list(unique(value))) %>%
      unnest(value)
    
    df1
    
    #    ID   value
    #   <fct> <dbl>
    # 1 A         1
    # 2 A         3
    # 3 A         2
    # 4 A         5
    # 5 B         1
    # 6 B         4
    # 7 B         5
    # 8 B         3
    # 9 B         6
    #10 B         7
    

    如果需要,我们可以使用split 将其存储为列表。

    split(df1$value, df1$ID)
    #$A
    #[1] 1 3 2 5
    
    #$B
    #[1] 1 4 5 3 6 7
    

    data.table 相当于上述内容:

    library(Data.table)
    
    setDT(df)
    df2 <- melt(df, id.vars = 'ID')[, .(value = list(unique(value))), ID]
    

    df2$value 中存在唯一值作为向量。

    数据

    df <- data.frame(ID = c('A', 'A', 'B', 'B'), 
           Alt1 = c(1, 2, 1, 3), 
           Alt2 = c(3, 5, 4, 6), 
           Alt3 = c(1, 3, 5, 7))
    

    【讨论】:

    • 是的,明白了。在获得 2 个具有 id、值的列表之后。我们可以将其转换为向量形式,其中名称是 ID,值是值列?
    • 上述解决方案有效。但我想申请 100k ids 的表。那么这是一个有效的解决方案吗?
    • 在data.table方法中如何将结果转化为列表形式?
    • 列表形式是什么意思? value 已经是一个列表。可能你的意思是长格式,在这种情况下做df2[, .(value = unlist(value)), ID]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-27
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多