Подмножество столбцов, если они удовлетворяют условию - PullRequest
1 голос
/ 21 марта 2019

Моя задача:

  • Выберите все столбцы, в которых строки равны 0 или 1.
  • Измените класс всех этих столбцов на факториальные (так как они двоичные).

В приведенном ниже случае CA + CC должно измениться на factorial.

CA = c(1,0,1,0,1)
CB = c(1,12,21,0,7)
CC = c(1,0,1,0,1)
mydf = data.frame(CA, CB, CC)
str(mydf)
    'data.frame':   5 obs. of  3 variables:
     $ CA: num  1 0 1 0 1
     $ CB: num  1 12 21 0 7
     $ CC: num  1 0 1 0 1

Почему? Потому что эти строки в настоящее время изображены как integer и number вместо factors. И я предполагаю, что некоторые ML-алгоритмы все перемешивают.

Ответы [ 3 ]

2 голосов
/ 21 марта 2019

Другой подход с dplyr s mutate_if

library(dplyr) 
is_one_zero <- function(x) {

  res <- all(unique(x) %in% c(1, 0))

  return(res)
}

out <- mydf %>% 
  mutate_if(is_one_zero, as.factor) 

str(out)
#'data.frame':  5 obs. of  3 variables:
# $ CA: Factor w/ 2 levels "0","1": 2 1 2 1 2
# $ CB: num  1 12 21 0 7
# $ CC: Factor w/ 2 levels "0","1": 2 1 2 1 2
2 голосов
/ 21 марта 2019

Просто еще один способ сделать это в базе R

cols <- colSums(mydf == 0 | mydf == 1) == nrow(mydf)
mydf[cols] <- lapply(mydf[cols], as.factor)

str(mydf)
#'data.frame':  5 obs. of  3 variables:
# $ CA: Factor w/ 2 levels "0","1": 2 1 2 1 2
# $ CB: num  1 12 21 0 7
# $ CC: Factor w/ 2 levels "0","1": 2 1 2 1 2
2 голосов
/ 21 марта 2019

в одну сторону с baseR:

#if all the values in a column are either 0 or 1 convert to factor
mydf[] <- lapply(mydf, function(x) {
  if(all(x %in% 0:1)) {
    as.factor(x)
  } else {
    x
  }
})

Out:

str(mydf)
#'data.frame':  5 obs. of  3 variables:
# $ CA: Factor w/ 2 levels "0","1": 2 1 2 1 2
# $ CB: num  1 12 21 0 7
# $ CC: Factor w/ 2 levels "0","1": 2 1 2 1 2**
...