У меня проблемы с ведущими и конечными пробелами в data.frame. Например, я хотел бы взглянуть на конкретные row
в data.frame
зависимости от определенного условия:
> myDummy[myDummy$country == c("Austria"),c(1,2,3:7,19)]
[1] codeHelper country dummyLI dummyLMI dummyUMI
[6] dummyHInonOECD dummyHIOECD dummyOECD
<0 rows> (or 0-length row.names)
Мне было интересно, почему я не получил ожидаемый результат, поскольку в моей стране явно существовала Австрия data.frame
. После просмотра истории кода и попытки выяснить, что пошло не так, я попытался:
> myDummy[myDummy$country == c("Austria "),c(1,2,3:7,19)]
codeHelper country dummyLI dummyLMI dummyUMI dummyHInonOECD dummyHIOECD
18 AUT Austria 0 0 0 0 1
dummyOECD
18 1
Все, что я изменил в команде, это дополнительные пробелы после Австрии.
Дальнейшие досадные проблемы, очевидно, возникают. Например, когда мне нравится объединять два кадра на основе столбца страны. Один data.frame
использует, "Austria "
а другой имеет "Austria"
. Соответствие не работает.
- Есть ли хороший способ «показать» пробелы на моем экране, чтобы я знал о проблеме?
- И могу ли я удалить начальные и конечные пробелы в R?
До сих пор я писал простой Perl
скрипт, который удаляет пробелы, но было бы неплохо, если бы я мог как-то сделать это внутри R.
sub()
используетPerl
обозначение, а также. Прости за это. Я собираюсь попытаться использовать функцию. Но по моему первому вопросу у меня пока нет решения.Ответы:
Вероятно, лучший способ - обработать замыкающие пробелы при чтении файла данных. Если вы используете
read.csv
илиread.table
вы можете установить параметрstrip.white=TRUE
.Если вы хотите очистить строки после этого, вы можете использовать одну из следующих функций:
Чтобы использовать одну из этих функций на
myDummy$country
:Чтобы «показать» пробел, вы можете использовать:
которая покажет вам строки, заключенные в кавычки ("), чтобы легче было найти пробелы.
источник
str_trim
вstringr
упаковке.Начиная с версии 3.2.0 была введена новая функция для удаления начальных / конечных пробелов:
Смотрите: http://stat.ethz.ch/R-manual/R-patched/library/base/html/trimws.html
источник
\n
то , что находится в покрытом классе символов.trimws("SELECT\n blah\n FROM foo;")
до сих пор содержит новые строки.trimws
регулярное выражение достаточно быстро.stringr::str_trim
(на основеstringi
) также интересен тем, что использует полностью независимую интернационализированную библиотеку строк. Можно подумать, что пробелы будут защищены от проблем с интернационализацией, но мне интересно. Я никогда не видел сравнения результатов нативных иstringr
/stringi
или каких-либо тестов.trimws()
не убрал свои ведущие пробелы, в то время как Брайанtrim.strings()
ниже (только 1 голос, мой!) Сделал ...Чтобы манипулировать пробелами, используйте str_trim () в пакете stringr. Пакет имеет руководство от 15 февраля 2013 г. и находится в CRAN. Функция также может обрабатывать строковые векторы.
(благодарность комментатору: Р. Коттон)
источник
trimws()
не удалось удалить.Простая функция для удаления начальных и конечных пробелов:
Применение:
источник
ad1) Чтобы увидеть пробелы, вы можете напрямую вызвать
print.data.frame
с измененными аргументами:Смотрите также
?print.data.frame
для других вариантов.источник
Используйте grep или grepl, чтобы найти наблюдения с пробелами и sub, чтобы избавиться от них.
источник
"^\\s+|\\s+$"
gsub
вместоsub
регулярного выражения Хэдли. Сsub
его помощьюЯ предпочел бы добавить ответ в качестве комментария к user56, но пока не могу писать как самостоятельный ответ. Удаление ведущих и конечных пробелов может быть достигнуто с помощью функции trim () из пакета gdata:
Пример использования:
источник
Другая связанная проблема возникает, если у вас есть несколько пробелов между входами:
Затем вы можете легко разбить эту строку на «настоящие» токены, используя регулярное выражение для
split
аргумента:Обратите внимание, что если есть совпадение в начале (непустой) строки, первый элемент выходных данных - это «» », но если в конце строки есть совпадение, выходные данные совпадают с со спичкой удалены.
источник
Другой вариант - использовать
stri_trim
функцию изstringi
пакета, которая по умолчанию удаляет начальные и конечные пробелы:Для удаления только начальных пробелов используйте
stri_trim_left
. Для удаления только конечных пробелов используйтеstri_trim_right
. Если вы хотите удалить другие начальные или конечные символы, вы должны указать это с помощьюpattern =
.Смотрите также
?stri_trim
для получения дополнительной информации.источник
Я создал
trim.strings ()
функцию для обрезки начальных и / или конечных пробелов как:Для иллюстрации
источник
Лучший метод - trimws ()
Следующий код будет применять эту функцию ко всему фрейму данных
источник
df[] <- lapply(df, trimws)
быть более компактным. Но это в обоих случаях приведет столбцы к символу.df[sapply(df,is.character)] <- lapply(df[sapply(df,is.character)], trimws)
быть в безопасности.Я пытался обрезать (). Хорошо работает с пробелами, а также с \ n. x = '\ n Harden, J. \ n'
подрезать (х)
источник
После этого вам нужно заставить R не распознавать «Австрию» как уровень. Давайте представим, что у вас также есть "США" и "Испания" в качестве уровней:
Немного менее пугающе, чем ответ с наибольшим количеством голосов, но он все равно должен работать.
источник