Измените класс с факторного на числовой для многих столбцов во фрейме данных - PullRequest
74 голосов
/ 26 сентября 2010

Какой самый быстрый / лучший способ заменить большое количество столбцов на числовые с коэффициента?

Я использовал следующий код, но, похоже, он переупорядочил мои данные.

> head(stats[,1:2])
  rk                 team
1  1 Washington Capitals*
2  2     San Jose Sharks*
3  3  Chicago Blackhawks*
4  4     Phoenix Coyotes*
5  5   New Jersey Devils*
6  6   Vancouver Canucks*

for(i in c(1,3:ncol(stats))) {
    stats[,i] <- as.numeric(stats[,i])
}

> head(stats[,1:2])
  rk                 team
1  2 Washington Capitals*
2 13     San Jose Sharks*
3 24  Chicago Blackhawks*
4 26     Phoenix Coyotes*
5 27   New Jersey Devils*
6 28   Vancouver Canucks*

Как лучше, если не называть каждый столбец следующим образом:

df$colname <- as.numeric(ds$colname)

Ответы [ 16 ]

1 голос
/ 27 февраля 2016

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

* 1003 Е.Г. *

Df <- data.frame(
  x = c(NA,as.factor(sample(1:5,30,r=T))),
  y = c(NA,as.factor(sample(1:5,30,r=T))),
  z = c(NA,as.factor(sample(1:5,30,r=T))),
  w = c(NA,as.factor(sample(1:5,30,r=T)))
)

Df[,c(1:4)] <- as.numeric(as.character(Df[,c(1:4)]))

Возвращает следующее:

Warning message:
NAs introduced by coercion 

    > head(Df)
       x  y  z  w
    1 NA NA NA NA
    2 NA NA NA NA
    3 NA NA NA NA
    4 NA NA NA NA
    5 NA NA NA NA
    6 NA NA NA NA

Но:

Df[,c(1:4)]= apply(Df[,c(1:4)], 2, function(x) as.numeric(as.character(x)))

Возвращает:

> head(Df)
   x  y  z  w
1 NA NA NA NA
2  2  3  4  1
3  1  5  3  4
4  2  3  4  1
5  5  3  5  5
6  4  2  4  4
0 голосов
/ 20 июня 2019

df$colname <- as.numeric(df$colname)

Я пробовал этот способ для изменения одного типа столбца, и я думаю, что это лучше, чем во многих других версиях, если вы не собираетесь изменять все типы столбцов

df$colname <- as.character(df$colname)

для наоборот.

0 голосов
/ 04 февраля 2019

Я перепробовал несколько подобных проблем и продолжал получать АН.Base R имеет некоторые действительно раздражающие способы принуждения, которые обычно исправляются в пакетах Tidyverse.Раньше я их избегал, потому что не хотел создавать зависимости, но они делают жизнь настолько проще , что теперь я даже не пытаюсь найти решение Base R большую часть времени.

Вот решение Tidyverse, которое чрезвычайно просто и элегантно:

library(purrr)

mydf <- data.frame(
  x1 = factor(c(3, 5, 4, 2, 1)),
  x2 = factor(c("A", "C", "B", "D", "E")),
  x3 = c(10, 8, 6, 4, 2))

map_df(mydf, as.numeric)
0 голосов
/ 18 декабря 2018

Исходя из ответа @ SDahm, это было «оптимальное» решение для моих tibble:

data %<>% lapply(type.convert) %>% as.data.table()

Для этого требуется dplyr и magrittr.

0 голосов
/ 07 декабря 2016

Вот что сработало для меня. Функция apply() пытается привести df к матрице и возвращает NA.

numeric.df <- as.data.frame(sapply(df, 2, as.numeric))

0 голосов
/ 20 мая 2015

У меня возникли проблемы с преобразованием всех столбцов в числовые с помощью вызова apply():

apply(data, 2, as.numeric)

Проблема заключается в том, что некоторые строки содержат запятую - например, «1024.63»из "1024.63" - и R не нравится этот способ форматирования чисел.Поэтому я удалил их и затем запустил as.numeric():

data = as.data.frame(apply(data, 2, function(x) {
  y = str_replace_all(x, ",", "") #remove commas
  return(as.numeric(y)) #then convert
}))

Обратите внимание, что для этого требуется загрузка пакета stringr.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...