R语言 用第一个非空左值填充单行中的空单元格

uinbv5nw  于 2023-04-18  发布在  其他
关注(0)|答案(3)|浏览(135)

假设我有如下的dataframe:

df = data.frame(C1 = rep(c("A", "B"), 20),
                  C2 = c(NA, rep(c("J", "K"), 19), "J"), 
                  C3 = c(NA, rep(c("J", "K"), 19), "J"),
                  C4 = rep(c("C", "D"), 20))

这给了我以下两个第一行:
| C1|C2|C3|C4|
| --------------|--------------|--------------|--------------|
| A|不适用|不适用|C|
| B|J|J|D|
是否有任何函数允许用左边第一个非空单元格填充列C2C3,即用值A填充?(依此类推;例如,如果我有列C5NA,它将用值C填充此单元格)
我的尝试不是那么“可管道”:

require(tidyverse)
df[1,] <- (as.data.frame(unlist(df[1,])) %>% fill(`unlist(df[1, ])`))[,1]

谢谢大家!

8ftvxx2r

8ftvxx2r1#

在各行中应用na.locf

library(zoo)
data.frame(t(apply(df, 1, na.locf, na.rm = FALSE))))
##    C1 C2 C3 C4
## 1   A  A  A  C
## 2   B  J  J  D
## 3   A  K  K  C
## 4   B  J  J  D
## 5   A  K  K  C
## 6   B  J  J  D
## ...

也可以写成:

df |>
  apply(1, na.locf, na.rm = FALSE) |>
  t() |>
  data.frame()

更新

已经采纳了TarJae的建议。

bq8i3lrv

bq8i3lrv2#

使用dplyrtidyr进行旋转的方法:

library(dplyr)
library(tidyr)

df %>%
  mutate(rn = row_number()) %>%
  pivot_longer(-rn) %>%
  fill(value, .direction = "down") %>%
  pivot_wider(names_from = name, values_from = value) %>%
  select(-rn)

#   C1    C2    C3    C4   
#   <chr> <chr> <chr> <chr>
# 1 A     A     A     C    
# 2 B     J     J     D    
# 3 A     K     K     C    
# 4 B     J     J     D    
# 5 A     K     K     C
kkih6yb8

kkih6yb83#

首先将t转换为宽格式,然后执行fill,最后转换回长格式。在此过程沿着重命名行和列。

library(dplyr)
library(tidyr)

data.frame(t(df)) %>% 
  fill(1:nrow(df)) %>% 
  t() %>% 
  data.frame(row.names = 1:nrow(df)) %>% 
  rename_with(\(x) colnames(df))
   C1 C2 C3 C4
1   A  A  A  C
2   B  J  J  D
3   A  K  K  C
4   B  J  J  D
...

相关问题