根据另一个变量的值删除重复的行

时间:2013-10-11 08:34:18

标签: r duplicates

我有一个重复日期,我想根据另一个变量的值删除它。如果相应重复日期的某个dmean值为NA,我想删除它。如果特定日期的两个dmean值都是NA,我想保留任何日期。示例数据如下: 我试过了

subset(df1, !duplicated(date)) 

但无论dmean的值如何,这都删除了所有重复项。例如,对于日期2010-12-23,我想保持dmean值28.38250而不是NA的值。

structure(list(date = c("2010-12-22", "2010-12-22", "2010-12-23", 
"2010-12-23", "2010-12-24", "2010-12-24", "2010-12-25", "2010-12-25", 
"2010-12-26", "2010-12-26", "2010-12-27", "2010-12-27", "2010-12-28", 
"2010-12-28"), dmean = c(NA, NA, NA, 28.3825, 35.54625, NA, 75.27625, 
NA, NA, 75.225, NA, 41.75, NA, 37.98375)), .Names = c("date", 
"dmean"), class = "data.frame", row.names = c(NA, -14L))

2 个答案:

答案 0 :(得分:1)

如果您先按datedmean订购数据框,它将会有效:

df1_sorted <- df1[order(df1$date, df1$dmean), ]

重新排序后,NA中的dmeans低于每个对应date的数值。

现在,您可以排除重复日期的行:

subset(df1_sorted, !duplicated(date))

结果:

         date    dmean
1  2010-12-22       NA
4  2010-12-23 28.38250
5  2010-12-24 35.54625
7  2010-12-25 75.27625
10 2010-12-26 75.22500
12 2010-12-27 41.75000
14 2010-12-28 37.98375

答案 1 :(得分:1)

以下是plyr的解决方案:

ddply(df, .(date), summarize,
      dmean=ifelse(all(is.na(dmean)), NA, max(dmean,na.rm=TRUE)))

给出了:

        date    dmean
1 2010-12-22       NA
2 2010-12-23 28.38250
3 2010-12-24 35.54625
4 2010-12-25 75.27625
5 2010-12-26 75.22500
6 2010-12-27 41.75000
7 2010-12-28 37.98375

请注意,如果您想要dmean值的均值,最小值或任何其他统计信息,则很容易更改函数调用。

您也可以使用data.table执行相同操作:

dt <- data.table(df)
dt[,list(dmean=ifelse(all(is.na(dmean)), NA_real_, max(dmean,na.rm=TRUE))),by=date]