Чтение нескольких целочисленных столбцов в виде строки, пытаясь gsub и конвертировать обратно в целое

У меня есть около 30 столбцов в рамках более 100 столбцов данных. файл, который я читаю, хранит его номера в виде символов. Другими словами, 1300 - 1300, и R думает, что это персонаж.

Я пытаюсь решить эту проблему, заменив "," ни с чем и превратить поле в целое число. Я не хочу использовать gsub на каждом столбце, который имеет проблему. Я бы предпочел хранить столбцы как вектор, который имеет проблему, и выполнять одну функцию или loop со всеми колоннами.

Я пытался использовать lapply, но не уверен, что поставить как "xпеременная

Вот моя функция с ошибкой под ней

ItemStats_2014[intColList] <- lapply(ItemStats_2014[intColList],
    as.integer(gsub(",", "", ItemStats_2014[intColList])) )

Ошибка в [.data.table(ItemStats_2014, intColList): Когда i является таблицей данных (или символьным вектором), столбцы, к которым нужно присоединиться, должны быть указаны либо с помощью аргумента on= (см.? Data.table), либо путем ввода x (т. Е. Отсортировано, и помечены как отсортированные, см.?setkey). Связи с ключами могут иметь дополнительные преимущества в скорости для очень больших данных из-за сортировки x в ОЗУ.

2 ответа

Решение

Попробуйте использовать dplyr::mutate_at() выбрать несколько столбцов и применить к ним преобразование.

ItemStats_2014 <- ItemStats_2014 %>%
    mutate_at(intColList, funs(as.integer(gsub(',', '', .))))

mutate_at выбирает столбцы из списка или использует функцию выбора dplyr (см. ?select_helpers) затем применяет одну или несколько функций к каждому столбцу. . в gsub относится к каждому выбранному столбцу, который mutate_at переходит к нему. Вы можете думать об этом как x в function(x) ...,

Файл, который я читаю, хранит его номера в виде символов [с запятыми в качестве десятичного разделителя]

Просто прочитайте эти столбцы как десятичные, а не как строки:data.table::fread() понимает десятичные разделители: dec=',' по умолчанию.

Возможно, вам придется поиграть с fread(..., colClasses=(...) ) Аргумент немного, чтобы указать целочисленные столбцы:

myColClasses <- rep('string',100) # for example...
myColClasses[intColList] <- 'integer'
# ...any other colClass fixup as needed...
ItemStats_2014 <- fread('your.csv', colClasses=myColClasses)

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

Другие вопросы по тегам