2

我有一个重复的日期,我想根据另一个变量的值删除它。如果相应重复日期的 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))
4

2 回答 2

1

date如果您首先订购数据框,它将起作用dmean

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

重新排序后,NAs indmeans低于每个对应 的数值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
于 2013-10-11T08:41:20.633 回答
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]
于 2013-10-11T08:46:01.007 回答