【问题标题】:Collapsing duplicates in R where only the unique column values get concatenated在 R 中折叠重复项,其中只有唯一的列值被连接
【发布时间】:2019-01-29 23:31:11
【问题描述】:

我需要折叠一个大表(V19 为 5M),在该表中我根据特定列 (V1) 删除重复项,如果唯一,则合并所有其他列的值(如果不是,则只报告一次结果)。

我从这里尝试了一些解决方案,但这些示例主要针对 2 个变量执行 - 我有 19 个。最终发生的情况是,表的整个其余部分都合并到一个数字列表列中。

输入:

V1         V2         V3         V4         V5         V6
TR1000     chr1       1000       1200       A          + 
TR1000     chr1       1000       1200       B          + 
TR1000     chr1       1000       1200       C          +  
TR2000     chr2       2000       2500       D          +   
TR2000     chr2       2000       2500       E          + 
TR3000     chr3       3000       3500       F          +  

我需要:

V1         V2         V3         V4         V5         V6
TR1000     chr1       1000       1200       A, B, C    + 
TR2000     chr2       2000       2500       D, E       +  
TR3000     chr3       3000       3500       F          + 

【问题讨论】:

  • aggregate(.~V1,df,unique) 或者更确切地说是aggregate(.~V1,df,function(x)toString(unique(x)))。如果你得到的是数字而不是值,那只是因为你有因素,所以使用选项 stringAsFactors=FALSE 或执行 df = rapply(df,as.character,'factor',how='replace') 或使用 dplyr 中的 groupby +summarize 重新读取数据
  • 欢迎来到 SO。请edit您的问题并展示您到目前为止所做的尝试。特别是,显示导致“表的整个其余部分组合在一个数字列表列中”的代码。谢谢。
  • 请澄清你的问题是从 2 到 19 个变量。示例数据集只有一列 V5 需要折叠。对于每个V1,所有其他列都有唯一值。这可能会刺激那些只是聚合/折叠V5的答案。
  • 我已经制作了一张代表我实际使用的表格的表格。放入实际表格并不是最佳选择,因为它相当大并且包含复杂的术语。也就是说,@www 给了我一个完美的建议!

标签: r dataframe aggregate


【解决方案1】:

使用dplyr 的解决方案。

library(dplyr)

dat2 <- dat %>%
  group_by_at(vars(-V5)) %>%
  summarize(V5 = toString(V5)) %>%
  ungroup() %>%
  select(names(dat))
dat2
# # A tibble: 3 x 6
#   V1     V2       V3    V4 V5      V6   
#   <chr>  <chr> <int> <int> <chr>   <chr>
# 1 TR1000 chr1   1000  1200 A, B, C +    
# 2 TR2000 chr2   2000  2500 D, E    +    
# 3 TR3000 chr3   3000  3500 F       +    

数据

dat <- read.table(text = "V1         V2         V3         V4         V5         V6
TR1000     chr1       1000       1200       A          + 
TR1000     chr1       1000       1200       B          + 
TR1000     chr1       1000       1200       C          +  
TR2000     chr2       2000       2500       D          +   
TR2000     chr2       2000       2500       E          + 
TR3000     chr3       3000       3500       F          +  ",
                  header = TRUE, stringsAsFactors = FALSE)

【讨论】:

    【解决方案2】:

    data.table 选项:

    library(data.table)
    setDT(dat)
    byCols <- setdiff(names(dat), "V5")
    dat[, .(v5 = toString(V5)),  by = byCols]
    
           V1   V2   V3   V4 V6      v5
    1: TR1000 chr1 1000 1200  + A, B, C
    2: TR2000 chr2 2000 2500  +    D, E
    3: TR3000 chr3 3000 3500  +       F
    

    【讨论】:

      猜你喜欢
      • 2021-12-24
      • 2021-06-25
      • 2012-08-16
      • 2018-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-03
      相关资源
      最近更新 更多