【问题标题】:aggregating unique values in columns to single dataframe "cell" [duplicate]将列中的唯一值聚合到单个数据框“单元格”[重复]
【发布时间】:2017-01-05 16:57:39
【问题描述】:

你好,伟大而无所不能的 stackoverflow,

我有一个这样结构的数据框。

Person     Dilution      Analyte     Meta#1      Meta#2
john         1            Blank       3x          100
john         2            Blank       3x          100
john         1            mulv        3x          100
john         2            mulv        3x          100
john         1            gp41        3x          100
john         2            gp41        3x          100
kelly        20           blank       3x          100
kelly        20           gp41        3x          100

可能有很多人,有许多不同的稀释度和分析物。列中的元信息将始终相同。我想生成以下数据框:

Person     Dilution      Analyte            Meta#1      Meta#2
john        1,2          Blank,mulv,gp41     3x          100
kelly       20           blank,gp41          3x          100

我想知道是否有人知道连接此类信息的任何巧妙技巧?

【问题讨论】:

  • @DavidArenburg 和@akrun,它是重复的,但 data.table、dplyr 和 aggregate 未用于另一个问题的答案。另一个问题的答案之一使用 plyr,它已被其他 Hadleyverse 包取代。当您有重复的问题,但原始问题的答案已过时或不包括“最先进”的方法时,您认为最好的做法是什么:我 (1) 是否仍应使用新的或更新的方法,(2) 添加新的或更新的方法作为原始问题的答案,(3) 两者,(4) 都不是?
  • @eipi10 我用一个更好的骗子结束了。但是整个 Google 页面也充满了这些软件包的问题/答案
  • @DavidArenburg 听起来不错,但是当原始问题没有最新或最先进的答案时,您如何看待一般问题? (如果您想讨论,请随时将其移至聊天。)
  • @eipi10 您应该在目标欺骗中添加答案时作为欺骗关闭。这样,目标将拥有所有信息,而不是分散在整个站点。这就是我认为为什么 SO 鼓励首先以骗子身份结束问题的原因 AFAIK

标签: r


【解决方案1】:

我更改了您的两个列名,因为# 在 R 数据框列名中不是合法字符。

使用dplyr

library(dplyr)

df %>%
  group_by(Person) %>%
  summarise_all(funs(paste(unique(.), collapse=",")))
  Person Dilution         Analyte Meta1 Meta2
1   john      1,2 Blank,mulv,gp41    3x   100
2  kelly       20      blank,gp41    3x   100

使用data.table

library(data.table)

setDT(df)[, lapply(.SD, function(x) paste(unique(x), collapse=",")), by=Person]

【讨论】:

    【解决方案2】:

    Base R 解决方案将使用aggregate

    aggregate(.~Person, df, function(x) as.character(unique(x)))
    
    
    #   Person Dilution         Analyte     Meta1 Meta2
    #1   john     1, 2   Blank, mulv, gp41     3x   100
    #2  kelly       20       blank, gp41       3x   100
    

    同样,

    aggregate(.~Person, df, function(x) toString(unique(x)))
    

    假设带有字符串的列类是字符而不是因子。

    【讨论】:

      猜你喜欢
      • 2021-10-17
      • 1970-01-01
      • 2021-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多