Powiedzmy, że chcę znaleźć liczbę słów w każdym wierszu ramki danych. W poniższym przykładzie chcę znaleźć, że pierwsza wartość w kolumnie pierwsza ma 3 słowa, druga wartość ma 4 słowa i tak dalej. Zakładam, że jest to zadanie dla jednej z funkcji Apply, ale nie mam szczęścia, aby to rozgryźć.

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

Czy muszę pracować z strsplit(), czy lepiej użyć funkcji apply() podczas tworzenia funkcja: apply(dat, 1, function(x)...

3
ATMathew 2 czerwiec 2011, 22:08

2 odpowiedzi

Najlepsza odpowiedź

Poniższy kod powinien to zrobić, zakładając, że wszystkie słowa są oddzielone spacjami.

sapply(strsplit(as.character(dat$one), " "), length)
# [1] 3 4 3 1
6
Joshua Ulrich 2 czerwiec 2011, 22:14

Kolejne podejście oparte na wyrażeniach regularnych. Pomysł jest taki, aby usunąć wszystko oprócz spacji i obliczyć długość zmodyfikowanego ciągu (czyli liczbę spacji, więc +1, aby uzyskać liczbę słów):

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

Możesz również dodać ochronę, aby obsługiwać ciąg znaków ze spacjami na początku lub na końcu:

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

Przykłady:

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

Jeszcze jedna kontrola bezpieczeństwa: zajmij się powtarzającymi się spacjami:

x <- " One    Two    "
nchar(gsub("[^ ]|^ *| *$", "", gsub(" +", " ", x))) + 1 
# [1] 2
2
Marek 3 czerwiec 2011, 13:48