Нахождение количества слов в каждой строке

Допустим, я хочу найти количество слов в каждой строке фрейма данных. Итак, в следующем примере я хочу найти, что первое значение в первом столбце содержит 3 слова, второе значение — 4 слова и так далее. Я предполагаю, что это задача для одной из функций применения, но мне не повезло понять это.

dat = data.frame(one=c("That is Cool",
  "I like my bank", "He likes pizza", "What"))

Нужно ли работать с strsplit() или лучше использовать функцию apply() при создании функции: apply(dat, 1, function(x)...


person ATMathew    schedule 02.06.2011    source источник


Ответы (2)


Приведенный ниже код должен сделать это, предполагая, что все слова разделены пробелами.

sapply(strsplit(as.character(dat$one), " "), length)
# [1] 3 4 3 1
person Joshua Ulrich    schedule 02.06.2011

Другой подход, основанный на регулярных выражениях. Идея состоит в том, чтобы удалить все, кроме пробелов, и вычислить длину измененной строки (т.е. количество пробелов, поэтому +1, чтобы получить количество слов):

nchar(gsub("[^ ]", "", dat$one)) + 1
# [1] 3 4 3 1

Также вы можете добавить защиту для обработки строки с пробелами в начале или конце:

nchar(gsub("[^ ]|^ *| *$", "", dat$one)) + 1
# [1] 3 4 3 1

Примеры:

x <- c(" One two ", "One Two ", " One two")
nchar(gsub("[^ ]", "", x)) + 1
# [1] 4 3 3
sapply(strsplit(x, " "), length)
# [1] 3 2 3
nchar(gsub("[^ ]|^ *| *$", "", x)) + 1
# [1] 2 2 2

Еще одна проверка безопасности: работа с повторяющимися пробелами:

x <- " One    Two    "
nchar(gsub("[^ ]|^ *| *$", "", gsub(" +", " ", x))) + 1 
# [1] 2
person Marek    schedule 03.06.2011