【问题标题】:Merge semi-duplicated rows in R合并R中的半重复行
【发布时间】:2016-01-09 19:54:42
【问题描述】:

我有一个看起来像这个子集的数据框(在下面的示例中称为 A):

Survey HaulNo Year Species Unsexed Males Females HaulUnique Lat_long  
FRGF      1   2000  134567      NA     4      NA     1_2000     50.7_-2.5 
FRGF      1   2000  134567      NA    NA       5     1_2000     50.7_-2.5 
FRGF      2   2003  134578      10    NA      NA     2_2003     49.5_-1.5 
FRGF      3   1998  123557      NA    NA       7     3_1998     50.1_-0.5
FRGF      3   1998  123557      NA     3      NA     3_1998     50.1_-0.5 

我想合并这些行,使它们看起来像下面的数据:

Survey HaulNo Year Species Unsexed Males Females HaulUnique Lat_long  
FRGF      1   2000  134567      NA     4      5     1_2000     50.7_-2.5 
FRGF      2   2003  134578      10    NA      NA    2_2003     49.5_-1.5 
FRGF      3   1998  123557      NA     3      7     3_1998     50.1_-0.5 

本质上,我想合并行,以便位于“未性别”、“男性”和“女性”列中的信息都在一行内,而不是在当前数据被拆分并出现重复信息的情况下在关于同一物种和运输等的多行上。重要的是,当我合并行时,其他所有内容都保持不变并保持唯一,因为每一行(一旦合并)代表一个独特的运输。

我不想对这 3 列应用任何类型的 sum/mean/other 函数,我想保持所有其他变量相同。我也不想创建任何额外的新列,并希望尽可能保留 NA。

注意。鉴于我有一个庞大的数据集,我并不总是知道 a) 哪些行是半重复的,b) 每行都有哪些无性别/男性/女性组合的信息。

我尝试了多种方法来做到这一点,但我都没有工作,部分原因是作为 RI 的初学者很难真正理解我尝试过的函数并将它们应用于我的数据(聚合、 ddply,演员)。

提前致谢。

【问题讨论】:

  • 或者使用data.table,你可以做类似setDT(df)[, lapply(.SD, function(x) sort(x)[1L]), by = .(Survey, HaulNo, Year, Species, HaulUnique, Lat_long)]的事情
  • 嗨,大卫,感谢您提供此代码。它运行良好,但实际上并没有合并行?它只是将 Unsexed、Males、Females 列重新排列到我的数据框右侧...
  • @KatherineMaltby 我认为您的流程有问题。两种解决方案都有效,但第二种解决方案将NAs 替换为零,因为它使用sum 函数和na.rm=T
  • 您的dput 与上面不同。查看HaulUnique 专栏。 HaulNo = 1 有 2 个不同的值。此处提供的解决方案假定您的唯一行标识符基于列 Survey, HaulNo, Year, Species, HaulUnique, Lat_long,因此您可以合并它们。否则是不可能的。
  • 问得好,这对我来说以前是个难题,但我已经对数据进行了重组,使每个数据只有一个值。

标签: r merge duplicates rows


【解决方案1】:

类似

aggregate(
  df[, c("Unsexed", "Males", "Females")],
  df[, c("Survey", "HaulNo", "Year", "Species", "HaulUnique", "Lat_long")],
  FUN = sum,
  na.rm = TRUE
)

【讨论】:

  • 感谢您的回复,但运行此程序时出现错误:[.data.frame(A, , c("Survey", "HaulNo", "Year", "Species", : 选择了未定义的列
  • 确保使用正确的 data.frame 名称。我假设df。此外,请确保聚合语句中的名称与 data.frame 的列名匹配。匹配意味着相同!
  • 修复了错误,代码运行但没有解决问题,只是在数据框的右侧添加了无性别、男性、女性列。
  • 请给出一个可重现的例子。给我们dput(df)的输出。显示我的代码的输出以及如果应该是什么。
  • 对不起,我之前没有在 Stackoverflow 上做过问题,最好把输出放在哪里?
猜你喜欢
  • 2016-02-11
  • 2017-01-31
  • 1970-01-01
  • 1970-01-01
  • 2021-11-23
  • 2013-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多