R - tidyr - spread() - 将 NA 作为列名处理
R - tidyr - spread() - dealing with NA as column name
我正在使用 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
对于 "NA" 列,我们可以使用 select
和 backquotes
。
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
来删除 'flower' 列中具有 'NA' 的行,但是这样我们将丢失一行,即。第三行.
根据@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
}
我正在使用 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
对于 "NA" 列,我们可以使用 select
和 backquotes
。
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
来删除 'flower' 列中具有 'NA' 的行,但是这样我们将丢失一行,即。第三行.
根据@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
}