2014-09-10 40 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