Я испытываю некоторые затруднения вести и запоздать пробел в data.frame. Например, мне нравится смотреть на определенное row
в a 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"
. Соответствие не работает.
До сих пор я раньше писал простое Perl
сценарий, который удаляет пробел, но было бы хорошо, если я могу так или иначе сделать это в R.
Вероятно, лучший способ - обрабатывать завершающие пробелы при чтении файла данных. Если вы используете read.csv
или read.table
, вы можете установить параметр strip.white = TRUE
.
Если вы хотите впоследствии очистить строки, вы можете использовать одну из этих функций:
# returns string w/o leading whitespace
trim.leading <- function (x) sub("^\\s+", "", x)
# returns string w/o trailing whitespace
trim.trailing <- function (x) sub("\\s+$", "", x)
# returns string w/o leading or trailing whitespace
trim <- function (x) gsub("^\\s+|\\s+$", "", x)
Чтобы использовать одну из этих функций в myDummy $ country
:
myDummy$country <- trim(myDummy$country)
Чтобы «показать» пробелы, которые вы можете использовать :
paste(myDummy$country)
, который покажет вам строки, заключенные в кавычки ("), что упрощает поиск пробелов.
ad1) Чтобы увидеть пробелы, вы можете напрямую вызвать print.data.frame
с измененными аргументами:
print(head(iris), quote=TRUE)
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1 "5.1" "3.5" "1.4" "0.2" "setosa"
# 2 "4.9" "3.0" "1.4" "0.2" "setosa"
# 3 "4.7" "3.2" "1.3" "0.2" "setosa"
# 4 "4.6" "3.1" "1.5" "0.2" "setosa"
# 5 "5.0" "3.6" "1.4" "0.2" "setosa"
# 6 "5.4" "3.9" "1.7" "0.4" "setosa"
См. Также ]? print.data.frame
для других опций.
Используйте grep или grepl для поиска наблюдений с пробелами и sub, чтобы избавиться от них .
names<-c("Ganga Din\t","Shyam Lal","Bulbul ")
grep("[[:space:]]+$",names)
[1] 1 3
grepl("[[:space:]]+$",names)
[1] TRUE FALSE TRUE
sub("[[:space:]]+$","",names)
[1] "Ganga Din" "Shyam Lal" "Bulbul"