Удаление круглых скобок и знака доллара с помощью gsub () в R?

Я импортировал CSV-файл в r. Некоторые из моих столбцов содержат данные о валюте (например, начинаются с символа «$»). Чтобы удалить символ «$» и преобразовать его в числовой тип, я использовал функцию gsub (), и она отлично работает. Пример кода:

strip_dollars = function(x) { as.numeric(gsub("[\\$, ]", "", x)) }
lapply(data[ , c("x4", "x5", "x7", "x8")] , strip_dollars) 

Но в одном конкретном столбце валюты у меня есть несколько записей в скобках, таких как (2345 долларов США), 3500 долларов США, 5600 долларов США, (3 234 доллара США), ..... Следовательно, для этого столбец приведенный выше код не работает. Пожалуйста, помогите мне удалить скобки и знак доллара из этих записей.

Кроме того, для определения столбцов, содержащих данные о валюте, я много пробовал, включая решения, приведенные в R - определить, какие столбцы содержат данные о валюте $, но это не работает. Пожалуйста, предложите оптимальный способ сделать это.


person Dr Nisha Arora    schedule 22.12.2018    source источник


Ответы (1)


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

s <- c("($2,345)", "$3,500", "$5,600", "($3,234)")
gsub("[$),]", "", s)
# [1] "(2345" "3500"  "5600"  "(3234"

Это удаляет большую часть мусора (который мы не хотели / не должны были сохранять), теперь давайте разберемся с ведущим левым символом:

gsub("^\\s*[(]", "-", gsub("[$),]", "", s))
# [1] "-2345" "3500"  "5600"  "-3234"

Отсюда, при необходимости, вы можете преобразовать в numeric:

as.numeric(gsub("^\\s*[(]", "-", gsub("[$),]", "", s)))
# [1] -2345  3500  5600 -3234

Это не очень надежно для неправильно сформированных строк. Например, хотя я ищу (и удаляю) начальный пробел для левого парена, все остальное будет проблемой.

person r2evans    schedule 22.12.2018
comment
Здорово! Оно работает. Отправьте ссылку с подробным объяснением, я считаю, что gsub () сбивает с толку, когда дело доходит до специальных символов. Спасибо - person Dr Nisha Arora; 23.12.2018
comment
Я просто заметил еще одну проблему. lapply преобразует мой фрейм данных в список, а использование as.data.frame дает ошибку «неправильное количество измерений». подскажите пожалуйста, как это исправить. - person Dr Nisha Arora; 23.12.2018
comment
Ссылка подробного объяснения? Не уверен, что вы имеете в виду ... моя единственная ссылка на это - _ 1_. Обратите внимание, что некоторые специальные символы теряют свою особенность, если они заключены в квадратные скобки ([ ]); например, ( и ) больше не являются определяющими группами при использовании в классе символов, ergo [(] будет соответствовать только парному знаку; Я считаю, что эту нотацию проще использовать (и объяснить), чем спрашивать, нужны ли мне обратные косые черты. - person r2evans; 23.12.2018
comment
Для решения вашей lapply проблемы попробуйте data[ , c(x4, x5, x7, x8)] <- lapply(data[ , c(x4, x5, x7, x8)], strip_dollars). Обратите внимание, что lapply по определению всегда будет возвращать list, нет причин ожидать чего-то другого. Тот факт, что data.frame является частным случаем list (все векторы имеют одинаковую длину), поэтому, заменяя часть кадра возвращением lapply, весь объект сохраняет свою целостность кадра. Если у вас возникли другие проблемы с lapply, которые это не решает, либо это новый вопрос, либо вам необходимо предоставить воспроизводимые данные в своем вопросе. - person r2evans; 23.12.2018
comment
Чтобы было ясно: lapply ничего не конвертирует. data[,c(...)] технически является списком, хотя это также фрейм. См. class(data[,c(...)]) и is.list(data[,c(...)]) (с использованием реальных имен столбцов вместо ...), чтобы увидеть, что это одновременно "data.frame" и TRUE (да, список). Возможно, как только вы поймете двойственность фреймов, такое поведение станет более осмысленным. - person r2evans; 23.12.2018
comment
И последнее, кстати: использование data[ , c(x4, x5, x7, x8)] не интуитивно (для меня) с базовыми фреймами: это означает, что у вас есть переменные с именем x4 (и т. Д.), Которые каким-то образом содержат столбцы (либо в виде целых чисел, либо по имени) для использования. Если у вас есть столбцы с именем "x4" (и т. Д.), То имеет смысл увидеть data[,c("x4","x5",...)]. (Если вы вместо этого используете data.table, это может иметь смысл, но следует упомянуть, если это важно для вас. Без этого я предполагаю базу и, следовательно, различия x4 и "x4".) - person r2evans; 23.12.2018
comment
да, это имена переменных, я только поправил. Спасибо - person Dr Nisha Arora; 23.12.2018