我有一个重复日期,我想根据另一个变量的值删除它。如果相应重复日期的某个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))
答案 0 :(得分:1)
如果您先按date
和dmean
订购数据框,它将会有效:
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]