Определение количества каждого слова в классификации с помощью stringr

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

library(stringr)
car <- c("Honda", "Chevy", "Toyota", "Ford")
school <- c("Michigan", "Ohio State", "Missouri")
car_match <- str_c(car, collapse = "|")
school_match <- str_c(school, collapse = "|")
df <- data.frame(keyword=c("He drives a Honda", 
                           "He goes to Ohio State", 
                           "He likes Ford and goes to Ohio State"))
df

main <- function(df) {
  df$car <- as.numeric(str_detect(df$keyword, car_match))
  df$school <- as.numeric(str_detect(df$keyword, school_match))
  df
}
main(df)

> main(df)
                               keyword car school
1                    He drives a Honda   1      0
2                He goes to Ohio State   0      1
3 He likes Ford and goes to Ohio State   1      1

Отлично, работает.

Теперь я хочу вернуться и посмотреть, смогу ли я легко подсчитать частоту каждого слова в «ведрах» автомобиля и школы.

Это должно выглядеть следующим образом

Car        Freq
Honda      1
Chevy      0 
Toyota     0
Ford       1

school     Freq
Michigan    0
Ohio State  2
Missouri    0

Поскольку Honda, которая входит в классификацию автомобилей, появляется один раз, ее частота равна единице. Аналогичным образом, штат Огайо, который входит в классификацию школ и встречается дважды, имеет частоту два.

Может ли кто-нибудь помочь мне перейти от сопоставления классификации к нахождению частоты каждого слова в классификации?

Я, вероятно, мог бы вернуться и установить каждое слово в машине как собственное str_c и сопоставить его таким образом, но я бы хотел найти «более простой» маршрут.


person ATMA    schedule 29.04.2014    source источник


Ответы (2)


Возможно что-то вроде этого:

sapply(car, function(x) sum(str_count(df$keyword, x)))
# Honda  Chevy Toyota   Ford 
#     1      0      0      1 

sapply(school, function(x) sum(str_count(df$keyword, x)))
# Michigan Ohio State   Missouri 
#        0          2          0
person Henrik    schedule 29.04.2014

Вы можете использовать пакет qdap для выполнения этой задачи следующим образом:

library(qdap)
key <- list(
    car = c("Honda", "Chevy", "Toyota", "Ford"),
    school = c("Michigan", "Ohio State", "Missouri")
)

(out <- with(df, termco(keyword, keyword, key, elim.old = FALSE)))
counts(out)

##                                keyword word.count Honda Chevy Toyota Ford Michigan Ohio State Missouri car school
## 1                    He drives a Honda          4     1     0      0    0        0          0        0   1      0
## 2                He goes to Ohio State          5     0     0      0    0        0          1        0   0      1
## 3 He likes Ford and goes to Ohio State          8     0     0      0    1        0          1        0   1      1

colSums(counts(out)[, -1])

## word.count      Honda      Chevy     Toyota       Ford   Michigan Ohio State   Missouri        car     school 
##         17          1          0          0          1          0          2          0          2          2 
person Tyler Rinker    schedule 30.04.2014