在R中合并含NA值的特定行:移除重复时间的NA行
解决整点重复行问题:保留有效elevation值
嘿,我来帮你搞定这个数据集的问题!从你提供的数据和截图来看,整点时刻会出现两行重复的Time记录,其中一行有有效的elevation值,另一行是NA。下面给你两个实用的R语言解决方案,按需选择就行:
方法1:直接移除elevation为NA的重复行
这个方法简单直接,过滤掉那些elevation为NA且属于重复Time的行,保留有有效数值的那一行。如果某个Time对应的两行elevation都是NA,那就保留其中一行(完全符合你说的“其他列保留NA也无妨”的需求)。
用dplyr包实现的代码:
library(dplyr) cleaned_data <- stackoverflow %>% # 保留两种行:elevation非NA的,或者是该Time的唯一行(避免过滤掉所有NA的情况) filter(!is.na(elevation) | !duplicated(Time, fromLast = TRUE))
如果你习惯用base R,也可以这样写:
# 生成保留行的索引 keep_rows <- !is.na(stackoverflow$elevation) | !duplicated(stackoverflow$Time, fromLast = TRUE) cleaned_data <- stackoverflow[keep_rows, ]
方法2:按时间分组合并(保留所有列的非NA值)
如果你的其他列也可能存在不同的非NA值,想要把同一Time的行合并,取每列的第一个非NA值,这个方法更通用:
library(dplyr) cleaned_data <- stackoverflow %>% group_by(Time) %>% # 对每一列,合并取第一个非NA值 summarise(across(everything(), ~ coalesce(!!!.)), .groups = "drop")
这个方法会自动把同一Time的所有行合并成一行,elevation列会保留有效的数值,其他列也会保留各自的非NA值,完美解决你的需求。
验证结果
处理完之后,你可以用head(cleaned_data)或者查看整点时刻的记录,比如filter(cleaned_data, Time == as.POSIXct("2015-05-24 14:00:00 UTC")),就能看到只保留了elevation为282.27的那一行啦。
你的数据集示例(前100行):
structure(list(Time = structure(c(1432425600, 1432426500, 1432427400, 1432428300, 1432429200, 1432430100, 1432431000, 1432431900, 1432432800, 1432433700, 1432434600, 1432435500, 1432436400, 1432437300, 1432438200, 1432439100, 1432440000, 1432440900, 1432441800, 1432442700, 1432443600, 1432444500, 1432445400, 1432446300, 1432447200, 1432448100, 1432449000, 1432449900, 1432450800, 1432450800, 1432451700, 1432452600, 1432453500, 1432454400, 1432454400, 1432455300, 1432456200, 1432457100, 1432458000, 1432458000, 1432458900, 1432459800, 1432460700, 1432461600, 1432461600, 1432462500, 1432463400, 1432464300, 1432465200, 1432465200, 1432466100, 1432467000, 1432467900, 1432468800, 1432468800, 1432469700, 1432470600, 1432471500, 1432472400, 1432472400, 1432473300, 1432474200, 1432475100, 1432476000, 1432476000, 1432476900, 1432477800, 1432478700, 1432479600, 1432479600, 1432480500, 1432481400, 1432482300, 1432483200, 1432483200, 1432484100, 1432485000, 1432485900, 1432486800, 1432486800, 1432487700, 1432488600, 1432489500, 1432490400, 1432490400, 1432491300, 1432492200, 1432493100, 1432494000, 1432494000, 1432494900, 1432495800, 1432496700, 1432497600, 1432498500, 1432499400, 1432500300, 1432501200, 1432502100, 1432503000), tzone = "UTC", class = c("POSIXct", "POSIXt")), Turtle = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), levels = c("R3L1", "R3L11", "R3L12", "R3L2", "R3L4", "R3L8", "R3L9", "R4L8", "R8L1", "R8L4", "R8NAT123"), class = "factor"), elevation = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 282.27, NA, NA, NA, NA, 283.21, NA, NA, NA, NA, 282.14, NA, NA, NA, NA, 281.63, NA, NA, NA, NA, 281.63, NA, NA, NA, NA, 281.63, NA, NA, NA, NA, 282.63, NA, NA, NA, NA, 281.63, NA, NA, NA, NA, 282.14, NA, NA, NA, NA, 281.63, NA, NA, NA, NA, 282.14, NA, NA, NA, NA, 281.36, NA, NA, NA, NA, 282.14, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA)), row.names = c(NA, -100L), class = c("tbl_df", "tbl", "data.frame"))

内容的提问来源于stack exchange,提问作者Cassidy
相关产品推荐
相关产品推荐

