我的数据框是这样的:
locID year effort1 effort2
1 L1 2000 iii A
2 L1 2000 iii B
3 L1 2001 iv A
4 L1 2001 iii A
5 L2 2000 iv B
6 L2 2000 iii B
7 L2 2001 iii A
8 L2 2001 iii B
我想拥有2000年和2001年的locID
对。但是,我只想要对effort1
和effort2
具有相同值的对。因此,在这个测试数据中,我只想保留第1,4,6和8行。这看起来相当复杂,而不是subset()
的能力。有什么建议吗?
我想要的数据框来自上面的
locID year effort1 effort2
1 L1 2000 iii A
4 L1 2001 iii A
6 L2 2000 iii B
8 L2 2001 iii B
答案 0 :(得分:2)
看起来你只想要locID,effort1和effort2同意的行。您可以使用duplicated
获得该功能。
D1 = which(duplicated(df[,c(1,3,4)]))
D2 = which(duplicated(df[,c(1,3,4)], fromLast=TRUE))
Keep = sort(unique(c(D1, D2)))
df[Keep,]
locID year effort1 effort2
1 L1 2000 iii A
4 L1 2001 iii A
6 L2 2000 iii B
8 L2 2001 iii B
一点解释。 duplicated
为所有实例提供重复行的第一个除外。当duplicated
与fromLast=TRUE
一起使用时,它会提供除最后一个之外的所有重复项。您可以将这些放在一起以获得所有重复项。
答案 1 :(得分:0)
来自dplyr
的解决方案。
library(dplyr)
dt2 <- dt %>%
group_by(locID, effort1, effort2) %>%
filter(n() > 1)
dt2
# A tibble: 4 x 4
# Groups: locID, effort1, effort2 [2]
locID year effort1 effort2
<chr> <int> <chr> <chr>
1 L1 2000 iii A
2 L1 2001 iii A
3 L2 2000 iii B
4 L2 2001 iii B
数据强>
dt <- read.table(text = " locID year effort1 effort2
1 L1 2000 iii A
2 L1 2000 iii B
3 L1 2001 iv A
4 L1 2001 iii A
5 L2 2000 iv B
6 L2 2000 iii B
7 L2 2001 iii A
8 L2 2001 iii B",
header = TRUE, stringsAsFactors = FALSE)