2015-10-17 2 views
1

Я распространяю несколько категориальных переменных на булевы столбцы, используя tidyr::spread(). Поскольку данные содержат НС, spread создает новый столбец без имени.R - tidyr - spread() - дело с NA как имя столбца

Что я ищу способ, чтобы избавиться от САМ с помощью

а) решение трубопроводов (я пытался select_() и '['(), но не знают, как относиться к NA столбца имя или индекс) или

б) пользовательская функция, которая была бы еще лучше

с) способ просто не генерировать столбцы 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

Мы можем использовать select с backquotes для столбца "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, поскольку наблюдения в других столбцах привязаны к нему. Мы могли бы использовать filter с is.na, чтобы удалить строку, которая имеет «NA» в столбце «цветок», но тогда мы потеряем одну строку, т.е. 3-й ряд.

0

В соответствии с ответом @ akrun вы можете использовать ссылку NA с backquotes. И вот функция, которая должна позаботиться об этом:

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 

}