用 R 组中的非 NA 字符替换一组值的 NA

Replace NAs for a group of values with a non-NA character in group in R

如果这个非 NA 字符并不总是出现在同一个位置(第一行或其他),我正在尝试找到一种方法来按组用非 NA 字符替换一组值的 NA .我发现的解决方案不适用于字符或仅根据先前或后续值进行填充。

这是一个数据示例:

participant_id <- c("ps1", "ps1", "ps1", "ps1", "ps2", "ps2", "ps3", "ps3", "ps3", "ps3")
test <- c("test1", NA, NA, NA, NA, "test2", NA, NA, "test3", NA)
data.frame(participant_id, test)

这就是我想要的结局:

participant_id test
ps1 test1
ps1 test1
ps1 test1
ps1 test1
ps2 test2
ps2 test2
ps3 test3
ps3 test3
ps3 test3
ps3 test3

按'participant_id'

分组后,我们可以使用tidyr中的fill
library(dplyr)
library(tidyr)
df1 <- df1 %>%
    group_by(participant_id) %>%
    fill(test, .direction = "downup") %>%
    ungroup

-输出

df1
# A tibble: 10 × 2
   participant_id test 
   <chr>          <chr>
 1 ps1            test1
 2 ps1            test1
 3 ps1            test1
 4 ps1            test1
 5 ps2            test2
 6 ps2            test2
 7 ps3            test3
 8 ps3            test3
 9 ps3            test3
10 ps3            test3

数据

df1 <- data.frame(participant_id, test)

这是使用 zoo 包中的 na.locf 的替代方法:

library(zoo)
library(dplyr)
df %>% 
  group_by(participant_id) %>% 
  arrange(participant_id, test) %>% 
  mutate(test = zoo::na.locf(test, na.rm=FALSE))
   participant_id test 
   <chr>          <chr>
 1 ps1            test1
 2 ps1            test1
 3 ps1            test1
 4 ps1            test1
 5 ps2            test2
 6 ps2            test2
 7 ps3            test3
 8 ps3            test3
 9 ps3            test3
10 ps3            test3