You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 06:45:37