在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.x
和fert_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