2014-09-10 38 views
0

我已經與樣本數據R有一個data.frame,看起來像這樣的:R:按列排序data.frame和有條件地刪除行

dat <- data.frame(NAME=c("NAME1","NAME1","NAME1","NAME1","NAME2","NAME2","NAME2","NAME2") , SURVEY_YEAR =c(1947,1958,1978,1987,1963,1991,2004,1993), REFERENCE_YEAR=c(1934,1947,1974,1947,1944,1987,1993,1987), VALUE=c(10,15,13,20,-2,7,12,-19)) 

dat 
     NAME SURVEY_YEAR REFERENCE_YEAR VALUE 
    1 NAME1  1947   1934 10 
    2 NAME1  1958   1947 15 
    3 NAME1  1978   1974 13 
    4 NAME1  1987   1947 20 
    5 NAME2  1963   1944 -2 
    6 NAME2  1991   1987  7 
    7 NAME2  2004   1993 12 
    8 NAME2  1993   1987 -19 

我怎麼可能通過REFERENCE_YEAR首先排它(從低到高):

NAME SURVEY_YEAR REFERENCE_YEAR VALUE 
1 NAME1  1947   1934 10 
2 NAME1  1958   1947 15 
3 NAME1  1987   1947 20 
4 NAME1  1978   1974 13 
5 NAME2  1963   1944 -2 
6 NAME2  1991   1987  7 
7 NAME2  1993   1987 -19 
8 NAME2  2004   1993 12 

然後如果REFERENCE_YEAR一年是一樣的,刪除從dat覆蓋更長的時間(從REFERENCE_YEARSURVEY_YEAR)的一個,然後寫入刪除RO ws變成新的data.frame

與樣本數據的data.frame應該是這樣的結尾:

NAME SURVEY_YEAR REFERENCE_YEAR VALUE 
1 NAME1  1947   1934 10 
2 NAME1  1958   1947 15 
3 NAME1  1978   1974 13 
4 NAME2  1963   1944 -2 
5 NAME2  1991   1987  7 
6 NAME2  2004   1993 12 

回答

0

BondedDust留下一個優雅的答案。我的回答遠比他長。但是,讓我離開它。

dat %>% 
    arrange(REFERENCE_YEAR) %>% 
    mutate(gap = SURVEY_YEAR - REFERENCE_YEAR) %>% 
    arrange(REFERENCE_YEAR, gap) %>% 
    group_by(NAME, REFERENCE_YEAR) %>% 
    filter(gap == gap[1]) %>% 
    arrange(NAME,REFERENCE_YEAR) 

# NAME SURVEY_YEAR REFERENCE_YEAR VALUE gap 
#1 NAME1  1947   1934 10 13 
#2 NAME1  1958   1947 15 11 
#3 NAME1  1978   1974 13 4 
#4 NAME2  1963   1944 -2 19 
#5 NAME2  1991   1987  7 4 
#6 NAME2  2004   1993 12 11 
+0

試過你的plyr例子,但是我得到的是一個錯誤,它找不到函數%<%? – kurdtc 2014-09-11 11:36:28

+0

@redshoe我用過'dplyr'。 '%>%'是您使用包的操作符。 – jazzurro 2014-09-11 13:38:55

+0

感謝您的信息!這個作品很棒!即使通過Bonded Dust的解決方案解決了上述問題! – kurdtc 2014-09-11 13:48:22

0

的第一步將是理清兩個REFERENCE_YEAR & SURVEY_YEAR。在最長間隔的項目將先被排序,將被作爲NOT-複製的複製()函數進行選擇,所以見好就收出來使用邏輯索引:

> dat2 <- dat[ order(dat$REFERENCE_YEAR, dat$SURVEY_YEAR) , ] 
> dat2 <- dat2[ !duplicated(dat2$REFERENCE_YEAR) , ] 
> dat2 
    NAME SURVEY_YEAR REFERENCE_YEAR VALUE 
1 NAME1  1947   1934 10 
5 NAME2  1963   1944 -2 
2 NAME1  1958   1947 15 
3 NAME1  1978   1974 13 
6 NAME2  1991   1987  7 
7 NAME2  2004   1993 12 
+0

謝謝!我還在'order()'之後的第一行添加了dat $ NAME,這樣如果有多於兩個不同的組(NAME),它也由組(NAME)排序。 – kurdtc 2014-09-10 13:44:35

+0

如果組中有兩個項目是「鄰近」以同一年結束或開始的組,您可能需要使用'!duplicated(dat2 [,c(「REFERENCE_YEAR」,「NAME」)]' – 2014-09-10 13:50:21

+0

此方法的問題在於,您將整個數據通過REFERENCE_VALUE,然後搜索重複的值,如果它被重複刪除它們,但我怎麼能應用這個(做到這一點),但由組(由NAME拆分)? – kurdtc 2014-09-11 11:34:04