2017-09-16 22 views
2

我有一個數據幀是這樣的:僅保留行與同各自的值

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 

我想有雙locID的從2000年和2001年,但我只想要擁有對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

好像你只是想在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時,它會給出除最後一個之外的所有副本。你可以把它們放在一起得到所有重複的東西。

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 

DATA

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)