【问题标题】:R - tidyr - spread() - dealing with NA as column nameR - tidyr - spread() - 处理 NA 作为列名
【发布时间】:2015-10-17 20:13:15
【问题描述】:

我正在使用 tidyr::spread() 将多个分类变量传播到布尔列。由于数据包含 NA,spread 创建一个没有名称的新列。

我正在寻找一种摆脱 NA 的方法

a) 管道解决方案(我尝试过 select_()'['(),但不知道如何引用 NA 列的名称或索引)或

b) 自定义函数,会更好

c) 一种简单地不生成 NA 列的方法,如果可能的话,与 Hadleyverse 兼容。

以下是我当前(非常不雅重复)的解决方案。

library(tidyr)
library(dplyr)

test <- data.frame(id = 1:4, name = c("anna", "bert", "charles", "daniel"),
                   flower = as.factor(c("rose", "rose", NA, "petunia")),
                   music = as.factor(c("pop","classical", "rock", NA)),
                   degree = as.factor(c(NA, "PhD", "MSc", "MSc")))

test <- test %>% 
  mutate(truval = TRUE) %>% 
  spread(key = flower, value = truval, fill = FALSE)
test[ncol(test)] <- NULL

test <- test %>% 
  mutate(truval = TRUE) %>% 
  spread(key = music, value = truval, fill = FALSE)
test[ncol(test)] <- NULL

test <- test %>% 
  mutate(truval = TRUE) %>% 
  spread(key = degree, value = truval, fill = FALSE)
test[ncol(test)] <- NULL

test

【问题讨论】:

    标签: r na piping tidyr spread


    【解决方案1】:

    我们可以将selectbackquotes 一起用于“NA”列。

     test %>% 
        mutate(truval= TRUE) %>% 
        spread(flower, truval, fill=FALSE) %>% 
        select(-`NA`)
     #  id    name     music degree petunia  rose
     #1  1    anna       pop   <NA>   FALSE  TRUE
     #2  2    bert classical    PhD   FALSE  TRUE
     #3  3 charles      rock    MSc   FALSE FALSE
     #4  4  daniel      <NA>    MSc    TRUE FALSE
    

    我想很难不生成 NA 列,因为其他列中的观察结果与之相关。我们可以使用filteris.na 来删除'flower' 列中具有'NA' 的行,但是我们将丢失一行,即。第三行。

    【讨论】:

      【解决方案2】:

      根据@akrun 的回复,您可以使用带反引号的引用 NA。这是一个处理它的函数:

      Spread_bool <- function(df, varname) {
      # spread a categorical variable to Boolean columns, remove NA column
      # Input:
      #  df: a data frame containing the variable to be spread
      #  varname: the "quoted" name of the variable to be spread
      #
      # Return:
      #  df: a data frame with the variable spread to columns
      
        df <- df %>% 
          mutate(truval = TRUE) %>% 
          spread_(varname, "truval", fill = FALSE) %>% 
          select(-`NA`)
      
        df
      
      }
      

      【讨论】:

        猜你喜欢
        • 2016-10-05
        • 2016-09-16
        • 2014-12-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多