Как изменить тип столбца через цикл for? - PullRequest
0 голосов
/ 09 октября 2018

У меня есть df, где некоторые столбцы являются символами типа, и я хотел бы, чтобы они были целочисленными значениями.Я знаю, что могу переключать типизацию, используя as.integer:

df$i <- as.integer(df$i)

Но я бы хотел, чтобы цикл изменял несколько столбцов вместо необходимости многократного выполнения команды.Вот мой код:

cols_to_change = c(37:49, 53:61)
  for(i in cols_to_change)
  {
    class(df[, i])  <- 'integer'
  }

Я получаю сообщение об ошибке, что объект списка не может быть преобразован в тип 'целое число', где я здесь не так?Есть ли более простой способ сделать это с помощью одной из функций применения?

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Я думаю, purrr::map или lapply предлагают здесь довольно элегантные решения (и просто скажем нет циклам for в R, если это возможно):

Давайте сделаем вам фальшивый фрейм данных со всеми символьными векторами:

> df <- data.frame(let1 = c('a', 'b', 'c'), num1 = c('1', '2', '3'),
             let2 = c('d', 'e', 'f'), num2 = c('4', '5', '6'),
             num3 = c('7', '8', '9'), let3 = c('g', 'h', 'i'),
             stringsAsFactors = FALSE)
> str(df)
'data.frame':   3 obs. of  6 variables:
 $ let1: chr  "a" "b" "c"
 $ num1: chr  "1" "2" "3"
 $ let2: chr  "d" "e" "f"
 $ num2: chr  "4" "5" "6"
 $ num3: chr  "7" "8" "9"
 $ let3: chr  "g" "h" "i"

Затем мы хотим изменить num1, num2 и num3 на целочисленные векторы (столбцы 2, 4 и 5).Для иллюстрации скопируйте df в df2, а затем используйте purrr::map.Здесь я ссылаюсь на столбцы по номерам столбцов, но вы также можете использовать имена.

> df2 <- df
> df2[, c(2,4,5)] <- purrr::map(df2[, c(2,4,5)], as.integer)
> str(df2)
'data.frame':   3 obs. of  6 variables:
 $ let1: chr  "a" "b" "c"
 $ num1: int  1 2 3
 $ let2: chr  "d" "e" "f"
 $ num2: int  4 5 6
 $ num3: int  7 8 9
 $ let3: chr  "g" "h" "i"

Если вы не хотите загружать другие пакеты, lapply будет работать:

> df3 <- df
> df3[, c(2,4,5)] <- lapply(df3[, c(2,4,5)], as.integer)
> str(df3)
'data.frame':   3 obs. of  6 variables:
 $ let1: chr  "a" "b" "c"
 $ num1: int  1 2 3
 $ let2: chr  "d" "e" "f"
 $ num2: int  4 5 6
 $ num3: int  7 8 9
 $ let3: chr  "g" "h" "i"
0 голосов
/ 09 октября 2018

Более простой способ сделать это - использовать dplyr::mutate_at:

df <- dplyr::mutate_at(df, c(37:49, 53:61), as.integer)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...