如何将含NA的数据框拆分为连续非NA行的分组数据框列表
提取GeomLine离散线条数据:连续非NA分组转数据框列表
需求说明
处理GeomLine对象的刻度数据时,需要从包含x、y列的数据框中提取离散线条对应的数据。y列存在NA值,要求找出至少包含两行连续无NA值的分组,并将这些分组转换为数据框列表。
示例数据
structure(list(x = c(96, 150, 150, 157, 163, 165, 165, 165, 166, 167, 168, 170, 178, 178, 184, 213), y = c(NA, 49, NA, NA, NA, 75, NA, 45, 50, NA, 55, 56.2, 55, 57, 50, NA)), class = "data.frame", row.names = c(NA, -16L)) #> x y #> 1 96 NA #> 2 150 49.0 #> 3 150 NA #> 4 157 NA #> 5 163 NA #> 6 165 75.0 #> 7 165 NA #> 8 165 45.0 #> 9 166 50.0 #> 10 167 NA #> 11 168 55.0 #> 12 170 56.2 #> 13 178 55.0 #> 14 178 57.0 #> 15 184 50.0 #> 16 213 NA
尝试过的代码
以下代码能筛选出符合连续条件的行,但无法直接转换为目标的分组数据框列表:
dplyr::filter(tidyr::drop_na(dplyr::mutate(structure(list(x = c(96, 150, 150, 157, 163, 165, 165, 165, 166, 167, 168, 170, 178, 178, 184, 213), y = c(NA, 49, NA, NA, NA, 75, NA, 45, 50, NA, 55, 56.2, 55, 57, 50, NA)), class = "data.frame", row.names = c(NA, -16L)), row_id = dplyr::row_number()), y), row_id == dplyr::lead(row_id) - 1 | row_id == dplyr::lag(row_id) + 1) #> x y row_id #> 1 165 45.0 8 #> 2 166 50.0 9 #> 3 168 55.0 11 #> 4 170 56.2 12 #> 5 178 55.0 13 #> 6 178 57.0 14 #> 7 184 50.0 15
期望结果
最终需要得到按连续非NA区块分组的数据框列表:
list(data.frame(x = c(165, 166), y = c(45, 50)), data.frame(x = c(168, 170, 178, 178, 184), y = c(55, 56.2, 55, 57, 50))) #> [[1]] #> x y #> 1 165 45 #> 2 166 50 #> #> [[2]] #> x y #> 1 168 55.0 #> 2 170 56.2 #> 3 178 55.0 #> 4 178 57.0 #> 5 184 50.0
最终解决方案
使用dplyr和基础R即可实现需求,代码逻辑清晰:
lineData |> group_by(group = cumsum(is.na(y))) |> filter(!(is.na(y) & n() > 1)) |> group_split() |> Filter(function(x) nrow(x) >= 2, x = _)
代码逻辑说明
group_by(group = cumsum(is.na(y))):以y列的NA值为分隔,给连续非NA的区块分配分组IDfilter(!(is.na(y) & n() > 1)):过滤掉全是NA的分组group_split():将分组后的数据拆分成数据框列表Filter(...):只保留行数≥2的分组,即至少包含两行连续非NA值的区块
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

