2015-10-17 67 views
1

我使用tidyr::spread()将多个分类变量分散到布尔列。由于数据包含NA,因此spread会创建一个没有名称的新列。R - tidyr - spread() - 处理NA作为列名

我正在寻找的是一种方式来获得使用驱除掉在NAS

一)管道解决方案(我已经试过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 

回答

2

我们可以使用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'的行,但那么我们将失去一行,即。第三排。

0

根据@ 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 

}