【问题标题】:Concatenate rows in a column by ID in R在R中按ID连接列中的行
【发布时间】:2016-10-20 03:57:20
【问题描述】:

我有一个地球化学数据集,它有 50 列和 16000 行。我需要连接由Sample_ID 分组的Field_Notes 列中的行中的数据。我曾尝试使用有效的聚合函数,但我最终只得到了这两个列的子集并删除了重复项。如果有人有任何建议,我将不胜感激。

我的数据如下所示:

   Sampe_ID Year Alt_Min    Field_Notes  X
1 97PQQT007 1997 Fe-Carb      qtz sweel  2
2 97PQQT007 1997 Fe-Carb          v. tr  2
3 97PQQT014 1997    <NA> qtz vn in bslt 15
4 97PQQT014 1997    <NA>    1-2% py,cpy 15
5 97PQQT006 1997 Fe-Carb         qtz vn  2
6 97PQQT004 1997 Fe-Carb         qtz vn  1
7 97PQQT004 1997 Fe-Carb           none  1

但应该是这样的:

   Sampe_ID Year Alt_Min                 Field_Notes  X
1 97PQQT007 1997 Fe-Carb            qtz sweel, v. tr  2
2 97PQQT007 1997 Fe-Carb            qtz sweel, v. tr  2
3 97PQQT014 1997    <NA> qtz vn in bslt, 1-2% py,cpy 15
4 97PQQT014 1997    <NA> qtz vn in bslt, 1-2% py,cpy 15
5 97PQQT006 1997 Fe-Carb                      qtz vn  2
6 97PQQT004 1997 Fe-Carb                qtz vn, none  1
7 97PQQT004 1997 Fe-Carb                qtz vn, none  1

这是一个可重现的数据框:

geochem <- data.frame(Sample_ID= c(1,1,2,2,3,4,4), Year = rep(1997, 7), Alt_Min = c(rep("Fe-Carb",2), rep(NA,2), rep("Fe-Carb",3)), Field_Notes = c("qtz sweel", "v. tr", "qtz vn in bslt", "1-2% py,cpy", "qtz  vn", "qtz vn", "none"), x = c(2,2,15,15,2,1,1))

【问题讨论】:

  • 尝试使用ave。可能是df$newVar &lt;- ave(df$Field_Notes, df$Sampe_ID, FUN=c)paste 而不是c
  • 使用data.table 包:setDT(df)[, Field_Notes := toString(Field_Notes), by = Sample_ID] 或使用dplyrdf %&gt;% group_by(Sample_ID) %&gt;% mutate(Field_Notes = toString(Field_Notes))
  • 感谢您的帮助。我已经发布了一个可重现的数据框,如果我发布不正确,我深表歉意。我是这里的新手!我已经尝试过你的建议,但没有运气。我一直在努力寻找这个问题的答案。

标签: r


【解决方案1】:

您可以结合使用withinave 来转换数据框。

within(geochem,
       {Field_Notes <- as.character(Field_Notes);
        Field_Notes <- ave(Field_Notes, Sample_ID, FUN = toString)})

函数toString用于将字符串粘贴在一起。

请注意,Field_Notes 因子被转换为字符串变量。

结果:

  Sample_ID Year Alt_Min                 Field_Notes  x
1         1 1997 Fe-Carb            qtz sweel, v. tr  2
2         1 1997 Fe-Carb            qtz sweel, v. tr  2
3         2 1997    <NA> qtz vn in bslt, 1-2% py,cpy 15
4         2 1997    <NA> qtz vn in bslt, 1-2% py,cpy 15
5         3 1997 Fe-Carb                     qtz  vn  2
6         4 1997 Fe-Carb                qtz vn, none  1
7         4 1997 Fe-Carb                qtz vn, none  1

【讨论】:

  • 太棒了!太感谢了。我已经为此苦苦挣扎了好几个小时。
【解决方案2】:

如果没有可重现的数据框,我无法确定这是否可行,但应该可行。在此处使用 dplyr 并将 df 替换为您的数据框名称。

library(dplyr)

geochem <- data.frame(Sample_ID= c(1,1,2,2,3,4,4), 
                      Year = rep(1997, 7), Alt_Min = c(rep("Fe-Carb",2), rep(NA,2), rep("Fe-Carb",3)), 
                      Field_Notes = c("qtz sweel", "v. tr", "qtz vn in bslt", 
                                      "1-2% py,cpy", "qtz  vn", "qtz vn", "none"), 
                      x = c(2,2,15,15,2,1,1)) 

geochem %>% group_by(x,Sample_ID) %>% summarise(Field_Notes=paste(Field_Notes, collapse=","))

这是我得到的确切输出:

   x      Sample_ID                Field_Notes
  <dbl>     <dbl>                      <chr>
     1         4                qtz vn,none
     2         1            qtz sweel,v. tr
     2         3                    qtz  vn
    15         2 qtz vn in bslt,1-2% py,cpy

【讨论】:

  • 非常感谢您的建议。这是一个可重现的数据框,可能会有所帮助:
  • 不幸的是,这是我运行您的代码时的结果:
  • Field_Notes 1 qtz sweel,v. tr,qtz vn in bslt,1-2% py,cpy,qtz vn,qtz vn,none >
  • 使用您的示例编辑了上面的答案,然后添加 Sample_ID 作为分组变量。现在运行良好。
  • 谢谢,我不确定我是否正确运行了您的代码,但结果是一个数据框,其中包含 1 个变量的 1 个观察值。我需要保留整个数据集,只需连接按 Sample_ID 分组的 Field_Notes 列中的行。
猜你喜欢
  • 1970-01-01
  • 2022-08-18
  • 2014-10-24
  • 1970-01-01
  • 1970-01-01
  • 2022-12-01
  • 2015-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多