r - 按行填充缺失值(右/左)
问题描述
我正在寻找一种NA
使用 dplyr 向右“填充”s(而不是向下/向上)的方法。换句话说,我想将 d 转换为 d2 而不必显式引用 mutate 调用中的任何列。
我的真实数据框有几十个字段,其中 NA 的交错块跨越可变数量的列。我很好奇是否有一种捷径可以全局继承左侧的第一个非 NA 值,无论它出现在哪个字段中。
d<-data.frame(c1=c("a",1:4), c2=c(NA,2,NA,4,5), c3=c(NA,3,4,NA,6))
d2<-data.frame(c1=c("a",1:4), c2=c("a",2,2,4,5), c3=c("a",3,4,4,6))
d
d2
解决方案
我们可以做一个gather
“长”格式,fill
按行号分组,然后spread
回到“宽”格式
library(tidyverse)
rownames_to_column(d, 'rn') %>%
gather(key, val, -rn) %>%
group_by(rn) %>%
fill(val) %>%
spread(key, val) %>%
ungroup %>%
select(-rn)
# A tibble: 5 x 3
# c1 c2 c3
# <chr> <chr> <chr>
#1 a a a
#2 1 2 3
#3 2 2 4
#4 3 4 4
#5 4 5 6
或者没有重塑的另一种选择是按行填充na.locf
library(zoo)
d %>%
mutate(c1 = as.character(c1)) %>%
pmap_dfr(., ~ na.locf(c(...)) %>%
as.list %>%
as_tibble)
此外,如果我们使用na.locf
,它会按列运行,因此可以转置数据并na.locf
直接应用
d[] <- t(na.locf(t(d)))
d
# c1 c2 c3
#1 a a a
#2 1 2 3
#3 2 2 4
#4 3 4 4
#5 4 5 6
正如@G.Grothendieck 在评论中提到的那样,为了照顾在行开头为 NA 的元素,请使用na.locf0
而不是na.locf
推荐阅读
- c# - 如果网站 URL 不包含任何语言代码,则执行某些操作
- php - WooCommerce 类别和子类别的永久链接
- google-apps-script - 通过链接和不受保护的范围共享电子表格
- json - 从响应中解析 PNG(没有默认的 JSON 解析)
- c# - Azure mip sdk 错误:NoPolicyException:未配置合规性策略:缺少
标签, - java - 未加载模式
- python - 图像分类异常 - 给定标签的 InvalidArgumentError
- java - 无法配置 Java Spring Boot 数据会话 Mongodb
- android - RecyclerView 从不显示
- python - 从post html传递变量时jinja2中的if语句