用列表中的字符填充 NA

Fill NA with character in list

我有一些数据如下:

library(tidyr)
library(data.table)
thisdata <-  data.frame(numbers = c(1,3,4,5,6,1,2,4,5,6)
                     ,letters = c('A','A','A','A','A','B','B','B','B','B'))

otherdata <-  data.frame(numbers = c(1,2,3,4,5,6))

我希望按字母列拆分 'thisdata',按数字列将两个列表合并为 'otherdata',然后用该列表中的相应字母填充字母 NA。所以:

out <- split(thisdata , f = thisdata$letters )
out2 <- lapply(out, function(x) merge(x,otherdata,by="numbers",all = TRUE))

但是,我无法让 tidyr 中的 'fill' 函数在 lapply

中工作
out3 <- lapply(out2,function(x) fill(x$channel))

 Error in UseMethod("fill_") : 
  no applicable method for 'fill_' applied to an object of class "NULL" 

这是我想要的输出,但更愿意在列表格式内执行计算:

out4 <- rbindlist(out2)

out5 <- out4 %>% 
  fill(letters) %>% #default direction down
  fill(letters,.direction = "up")

   numbers letters
 1:       1       A
 2:       2       A
 3:       3       A
 4:       4       A
 5:       5       A
 6:       6       A
 7:       1       B
 8:       2       B
 9:       3       B
10:       4       B
11:       5       B
12:       6       B

fill 需要一个数据帧作为第一个参数,尝试 fill(x, letters)x %>% fill(letters)magrittr 管道:

out3 <- lapply(out2,function(x) fill(x, letters))

out3
#$A
#  numbers letters
#1       1       A
#2       2       A
#3       3       A
#4       4       A
#5       5       A
#6       6       A

#$B
#  numbers letters
#1       1       B
#2       2       B
#3       3       B
#4       4       B
#5       5       B
#6       6       B

更简单的方法是使用 tidyr::complete:

thisdata %>% 
    complete(numbers = otherdata$numbers, letters) %>% 
    arrange(letters)

# A tibble: 12 x 2
#   numbers letters
#     <dbl>  <fctr>
# 1       1       A
# 2       2       A
# 3       3       A
# 4       4       A
# 5       5       A
# 6       6       A
# 7       1       B
# 8       2       B
# 9       3       B
#10       4       B
#11       5       B
#12       6       B