Функция для преобразования набора категориальных переменных в один вектор - PullRequest
2 голосов
/ 04 мая 2020

Есть много сообщений о создании фиктивных переменных, но в моем случае у меня есть набор столбцов, похожих на фиктивные переменные, которые необходимо перекодировать обратно в один столбец.

Задано как набор категориальных / строковых переменных (округов) в США):

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
  }

Но это не работает. Я пробовал множество подобных попыток. Сбой.

Идея состоит в том, чтобы взять фрейм данных с некоторым количеством строковых столбцов и переместить их значения, если не пустые, в новый столбец.

1 Ответ

2 голосов
/ 04 мая 2020

Мы можем использовать 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"
...