仅保留具有相同值的行

时间:2017-09-16 22:35:04

标签: r

我的数据框是这样的:

  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对。但是,我只想要对effort1effort2具有相同值的对。因此,在这个测试数据中,我只想保留第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

2 个答案:

答案 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为所有实例提供重复行的第一个除外。当duplicatedfromLast=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)