在R语言中按日期将Precip_Tot列重复值转为NA(保留行)
按日期将DataFrame重复Precip_Tot值转为NA(保留所有行)
原始数据结构
dput(prec) structure(list(date = structure(c(19091, 19091, 19092, 19092, 19093, 19093, 19094, 19094, 19095, 19095, 19096, 19096, 19097, 19097, 19098, 19098, 19099, 19099, 19100, 19100, 19101, 19101, 19102, 19102, 19103, 19103, 19104, 19104, 19105, 19105, 19106, 19106, 19107, 19107, 19109, 19109, 19110, 19110, 19111, 19111, 19112, 19112, 19113, 19113, 19114, 19114), class = "Date"), target = c("grass", "tree", "grass", "tree", "grass", "tree", "grass", "tree", "grass", "tree", "grass", "tree", "grass", "tree", "grass", "tree", "grass", "tree", "grass", "tree", "grass", "tree", "grass", "tree", "grass", "tree", "grass", "tree", "grass", "tree", "grass", "tree", "grass", "tree", "grass", "tree", "grass", "tree", "grass", "tree", "grass", "tree", "grass", "tree", "grass", "tree"), Precip_Tot = c(0, 0, 0, 0, 0.0464, 0.0464, 0.0362, 0.0362, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.131, 0.131, 0, 0, 0, 0, 0, 0, 0.016, 0.016, 0, 0, 0, 0, 0, 0, 0, 0, 0.4506, 0.4506)), row.names = c(NA, 46L), class = "data.frame")
解决方案
方法1:使用dplyr(tidyverse)
按日期分组后,仅保留每组首行的Precip_Tot值,其余行转为NA:
library(dplyr) prec <- prec %>% group_by(date) %>% mutate(Precip_Tot = if_else(row_number() == 1, Precip_Tot, NA_real_)) %>% ungroup()
方法2:使用Base R(无需额外包)
利用duplicated()标记重复日期行,直接将对应位置的Precip_Tot设为NA:
prec$Precip_Tot[duplicated(prec$date)] <- NA
效果说明
处理后,每个日期仅第一行保留原始Precip_Tot值,同日期的其他行该字段转为NA,所有原始行完整保留。例如日期19093对应的grass行保留0.0464,tree行的Precip_Tot变为NA。
内容的提问来源于stack exchange,提问作者Cláudio Siva
相关产品推荐
相关产品推荐

