R -删除数据表中的重复行(基于2列,无论顺序)



在SO上有一些类似的问题,但似乎没有一个适用于我的特定数据格式,因此我决定发布我的问题。

我的数据表是这样的:

year  field fert_name.x   yield.x fert_name.y   yield.y
1: 2017 field1       fertA  7.875775       fertB 14.404673
2: 2017 field1       fertA  7.875775       fertC 10.514350
3: 2017 field1       fertB 14.404673       fertA  7.875775
4: 2017 field1       fertB 14.404673       fertC 10.514350
5: 2017 field1       fertC 10.514350       fertA  7.875775
6: 2017 field1       fertC 10.514350       fertB 14.404673
7: 2017 field2       fertA  9.089769       fertB 10.281055
8: 2017 field2       fertA  9.089769       fertC 14.568333
9: 2017 field2       fertB 10.281055       fertA  9.089769
10: 2017 field2       fertB 10.281055       fertC 14.568333
11: 2017 field2       fertC 14.568333       fertA  9.089769
12: 2017 field2       fertC 14.568333       fertB 10.281055
13: 2018 field1       fertA 12.883051       fertB  5.455565
14: 2018 field1       fertA 12.883051       fertC  9.566147
15: 2018 field1       fertB  5.455565       fertA 12.883051
16: 2018 field1       fertB  5.455565       fertC  9.566147
17: 2018 field1       fertC  9.566147       fertA 12.883051
18: 2018 field1       fertC  9.566147       fertB  5.455565
19: 2018 field2       fertA 13.830174       fertB 13.924190
20: 2018 field2       fertA 13.830174       fertC  9.533342
21: 2018 field2       fertB 13.924190       fertA 13.830174
22: 2018 field2       fertB 13.924190       fertC  9.533342
23: 2018 field2       fertC  9.533342       fertA 13.830174
24: 2018 field2       fertC  9.533342       fertB 13.924190

和我想删除的所有行,为每年和字段fert_name.xfert_name.y是重复的。这种情况的例子是第1行和第3行(fertA/fertB和fertB/fertA),第2行和第5行(fertA/fertC和fertC/fertA),等等。

最好的方法是什么?

复制数据集的步骤:

library(data.table)
# create some fake data
dat <- data.table(expand.grid(year=2017:2018,
field=c("field1","field2"),
fert_name=c("fertA","fertB","fertC"),
stringsAsFactors=F))
set.seed(123); yld <- runif(12, min=5, max=15)
dat$yield <- yld
(dat.m <- merge(dat, dat, by=c("year","field"), allow.cartesian=T)[fert_name.x != fert_name.y])

我认为你当前的框架中没有保留的行,因为你有一个完整的"完美"所有对的展开。然而,让我们稍微改变一下,以确保我们有一些数据要保留:

dat.m <- dat.m[-c(3,5),]

有了它,我们可以提供一个"sorted"列的选择,以便我们可以处理您的fert_name.*列的不同顺序:

dat.m[, `:=`(
fert1 = pmin(fert_name.x, fert_name.y),
fert2 = pmax(fert_name.x, fert_name.y))
][, .SD[.N == 1,], by = .(year, field, fert1, fert2)]
#     year  field  fert1  fert2 fert_name.x  yield.x fert_name.y  yield.y
#    <int> <char> <char> <char>      <char>    <num>      <char>    <num>
# 1:  2017 field1  fertA  fertB       fertA 7.875775       fertB 14.40467
# 2:  2017 field1  fertA  fertC       fertA 7.875775       fertC 10.51435

最新更新