用R中最近的右侧行值填充NA行值

kon*_*hil 1 r zoo na dplyr

我想将给定的数据帧从

             c1     c2   c3   c4    c5
    VEG PUFF <NA>    12  <NA>  <NA> 78.43
CHICKEN PUFF <NA>    16  <NA>  88.24 <NA>
BAKERY Total <NA>   <NA>  28   <NA> 84.04
Run Code Online (Sandbox Code Playgroud)

到

             c1     c2  
    VEG PUFF 12     78.43   
CHICKEN PUFF 16     88.24    
BAKERY Total 28     84.04
Run Code Online (Sandbox Code Playgroud)

我尝试了两种方法,但没有得到准确的结果有时会取左侧行值

step1 <-  t(na.locf(t(df), fromLast=T))
step2 <-  t(na.locf(t(step1), fromLast=F))

library(dplyr)
MyReplace = function(data) {data %>% t %>% na.locf(.,,T) %>% na.locf %>% t
Run Code Online (Sandbox Code Playgroud)

Ron*_*hah 6

更新

由于预期输出存在很多混淆,因此使用tidyverse 解决方案更新@DavidArenburg 建议的答案

library(dplyr)
library(tidyr)
df %>%
  add_rownames() %>%
  gather(variable, value, -rowname) %>%
  filter(!is.na(value)) %>%
  group_by(rowname) %>%
  mutate(indx = row_number()) %>%
  select(-variable) %>%
  spread(indx, value)

#        rowname   `1`   `2`
#*        <chr> <dbl> <dbl>
#1 BAKERY_Total    28 84.04
#2 CHICKEN_PUFF    16 88.24
#3     VEG_PUFF    12 78.43
Run Code Online (Sandbox Code Playgroud)

另一种解决方案可能是

library(data.table)
temp <- apply(df, 1, function(x) data.frame(matrix(x[!is.na(x)], nrow = 1)))
rbindlist(temp, fill = T)
Run Code Online (Sandbox Code Playgroud)

上一个答案

如果我理解正确,您正在尝试用NA同一行中的最新非 NA 值替换一行中的值

我们可以使用na.locf同fromLast一套为TRUE

t(apply(df, 1, function(x) na.locf(x, fromLast = T, na.rm = F)))


#             c1 c2    c3    c4    c5
#VEG_PUFF     12 12 78.43 78.43 78.43
#CHICKEN_PUFF 16 16 88.24 88.24    NA
#BAKERY_Total 28 28 28.00 84.04 84.04
Run Code Online (Sandbox Code Playgroud)