R 合并长度相等但级别不同的因子变量忽略NA

R 合并长度相等但级别不同的因子变量忽略NA,r,forcats,R,Forcats,我有各种来源的调查数据。大多数是具有不同水平的因子变量。合并时,这意味着存在相同长度的变量,每个变量都包含许多包含信息的行,而其他行是NA。因此,在合并完整df中的每一行时,应该包含信息,同时忽略NA并保持相同的长度 我尝试过forcats包,因为它包含操纵不同因子水平的函数,但我没有找到一个解决方案,可以在将不同因子与其对应水平合并时移除NA v1 <- as.factor(c("a","b","c","x","x",NA,NA,NA,NA,NA,NA,NA,NA,NA,NA)) v2&

我有各种来源的调查数据。大多数是具有不同水平的因子变量。合并时,这意味着存在相同长度的变量,每个变量都包含许多包含信息的行,而其他行是NA。因此,在合并完整df中的每一行时,应该包含信息,同时忽略NA并保持相同的长度

我尝试过forcats包,因为它包含操纵不同因子水平的函数,但我没有找到一个解决方案,可以在将不同因子与其对应水平合并时移除NA

v1 <- as.factor(c("a","b","c","x","x",NA,NA,NA,NA,NA,NA,NA,NA,NA,NA))
v2<- as.factor(c(NA,NA,NA,NA,NA,"c","c","c","b","a",NA,NA,NA,NA,NA))
v3<- as.factor(c(NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,"f","c","c","b","a"))
df<- data.frame(v1,v2,v3)
在baser中,我们可以使用unlist和Filter来省略NA值

在baser中,我们可以使用unlist和Filter来省略NA值

我们可以使用合并

或者更紧凑

library(purrr)
reduce(df, coalesce)
#[1] "a" "b" "c" "x" "x" "c" "c" "c" "b" "a" "f" "c" "c" "b" "a"
或者在R底

我们可以使用合并

或者更紧凑

library(purrr)
reduce(df, coalesce)
#[1] "a" "b" "c" "x" "x" "c" "c" "c" "b" "a" "f" "c" "c" "b" "a"
或者在R底

library(tidyverse)

map(df, ~na.omit(.x)) %>% unlist %>% unname
 [1] a b c x x c c c b a f c c b a
Levels: a b c x f
Filter(function(x) !is.na(x) , unlist(df, use.names = FALSE))
#[1] a b c x x c c c b a f c c b a
#Levels: a b c x f
library(dplyr)
df %>% 
   transmute(v = coalesce(!!! .)) %>% 
   pull(v)
#[1] "a" "b" "c" "x" "x" "c" "c" "c" "b" "a" "f" "c" "c" "b" "a"
library(purrr)
reduce(df, coalesce)
#[1] "a" "b" "c" "x" "x" "c" "c" "c" "b" "a" "f" "c" "c" "b" "a"
do.call(pmin, c(lapply(df, as.character), na.rm = TRUE))
#[1] "a" "b" "c" "x" "x" "c" "c" "c" "b" "a" "f" "c" "c" "b" "a"