gpt4 book ai didi

r - 按行填充缺失值(右/左)

转载 作者:行者123 更新时间:2023-12-01 09:12:42 25 4
gpt4 key购买 nike

我正在寻找一种方法来“填充”NA s 向右(而不是向下/向上)与 dplyr。换句话说,我想将 d 转换为 d2 而不必显式引用 mutate 调用中的任何列。

我的真实数据框有几十个字段,其中 NA 的交错 block 跨越可变数量的列。我很好奇是否有一种捷径可以全局继承左侧的第一个非 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

关于r - 按行填充缺失值(右/左),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55671205/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com