【问题标题】:merging factor variables of equal length but different levels ignoring NA合并长度相等但不同级别忽略NA的因子变量
【发布时间】:2019-08-07 20:06:44
【问题描述】:

我有来自不同来源的调查数据。大多数是不同水平的因子变量。合并时,这意味着有相同长度的变量,每个变量包含若干行有信息,而其他行是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)

一个合并的变量应该看起来像一个包含:

("a","b","c","x","x","c","c","c","b","a","f","c","c","b","a")

【问题讨论】:

    标签: r forcats


    【解决方案1】:
    library(magrittr)
    
    lapply(df, function(x){
      x[!is.na(x)] %>%
        t %>%
        as.character
      }) %>%
      unlist %>%
      as.factor %>%
      `names<-`(NULL)
    
     [1] a b c x x c c c b a f c c b a
    Levels: a b c f x
    

    【讨论】:

      【解决方案2】:
      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
      

      【讨论】:

        【解决方案3】:

        在基础 R 中,我们可以使用 unlist 然后使用 Filter 来省略 NA 值。

        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
        

        【讨论】:

          【解决方案4】:

          我们可以使用coalesce

          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"
          

          或在base R

          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"
          

          【讨论】:

            猜你喜欢
            • 2019-01-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-08-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多