【发布时间】: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