将一组分类变量转换为单个向量的函数

Function to convert set of categorical variables to single vector

有很多关于创建虚拟变量的帖子,但在我的例子中,我有一组类似于虚拟变量的列,需要重新编码回一个列。

给定一组 categorical/string 个变量(美国的县):

a<-c(NA,NA,"Cameron","Luzerne");b<-c(NA,"Luzerne",NA,NA);c<-c("Chester",NA,NA,NA)
df<-as.data.frame(cbind(a,b,c))

如何创建可以将它们转换为单个类别的函数?该函数应该适用于任何连续的字符串列集。

结果应如下所示:

newcol    a           b          c
Chester   <NA>        <NA>       Chester
Luzerne   <NA>        Luzerne    <NA>
Cameron   Cameron    <NA>        <NA>
Luzerne   <NA>        Luzerne    <NA>

我写了这个函数,它接受三个参数:

cn<-function(df,s,f){
  for(i in seq_along(df[ ,c(s:f)]) )  # for specified columns in a dataframe...
  ifelse(is.na(df[,i]),NA,df[ ,i] )   # return value if not NA
  }

但是没用。我尝试过各种类似的尝试。失败。

我们的想法是获取一个包含一定数量字符串列的数据框,并将它们的值(如果不是空白)移动到新列。

我们可以使用coalesce

library(dplyr)
df %>%
    mutate_all(as.character) %>%
    mutate(newcolumn = coalesce(!!! .)) %>%
    select(newcolumn, everything())
#   newcolumn       a       b       c
#1   Chester    <NA>    <NA> Chester
#2   Luzerne    <NA> Luzerne    <NA>
#3   Cameron Cameron    <NA>    <NA>
#4   Luzerne Luzerne    <NA>    <NA>

base R中,一个选项是pmax

do.call(pmax, c(lapply(df, as.character), na.rm = TRUE))
#[1] "Chester" "Luzerne" "Cameron" "Luzerne"