счетчик частоты слов в r

Я хотел бы выполнить определенную операцию, которая преобразует данные в предоставленный формат:

Вход :

Col_A                         Col_B
textA textB                     10
textB textC                     20
textC textD                     30
textD textE                     40
textE textF                     20

Операция:

ColA           ColB(Frequency)            ColC
textA                  1                    10
textB                  2                  10+20
textC                  2                  20+30
textD                  2                  30+40
textE                  2                  40+20
textF                  1                    20

Выход:

  ColA           ColB(Frequency)            ColC
    textA                  1                  10
    textB                  2                  30
    textC                  2                  50
    textD                  2                  70
    textE                  2                  60
    textF                  1                  20

В настоящее время я использую

k <- (dfm(A2$Query, ngrams = 1, concatenator = " ", verbose = FALSE))
k <- colSums(k)
k <- as.data.frame(k)

И это дало мне частотную колонку. Как добиться colC?


person vk087    schedule 08.04.2016    source источник


Ответы (2)


Мы могли бы использовать cSplit() из пакета splitstackshape в сочетании с dplyr.

library(splitstackshape)
library(dplyr)
cSplit(df, "Col_A", sep = " ", direction = "long") %>% 
  group_by(Col_A) %>%
  summarise(Freq = n(), ColC = sum(Col_B))
#   Col_A  Freq  ColC
#  (fctr) (int) (int)
#1  textA     1    10
#2  textB     2    30
#3  textC     2    50
#4  textD     2    70
#5  textE     2    60
#6  textF     1    20

Данные

df <- structure(list(Col_A = structure(1:5, .Label = c("textA textB", 
"textB textC", "textC textD", "textD textE", "textE textF"), class = "factor"), 
    Col_B = c(10L, 20L, 30L, 40L, 20L)), .Names = c("Col_A", 
"Col_B"), class = "data.frame", row.names = c(NA, -5L))
person mtoto    schedule 08.04.2016
comment
Спасибо, это помогает, однако метод застревает, делая то же самое с большим набором данных. - person vk087; 08.04.2016
comment
что значит застрял? - person mtoto; 08.04.2016
comment
Можете ли вы уточнить, как это работает? Я новичок в Р. - person vk087; 08.04.2016
comment
?cSplit разбивает значения в Col_A по разделителю " " и складывает данные в формате long. Проверьте вывод перед первым %>%, теперь этот вывод суммируется последующими вызовами dplyr. - person mtoto; 08.04.2016
comment
Привет, если предположим, что вместо униграммы я хочу сделать то же самое с биграммой, то как мне поступить? В этом случае выполнение биграммы вернет ввод в качестве вывода. Если вы хотите, я могу изменить вопрос вместе с некоторыми другими данными. пожалуйста помоги. - person vk087; 08.04.2016

Вот еще вариант с separate/gather

library(dplyr)
library(tidyr)
separate(df1, Col_A, into = c("Col_A1", "Col_A2")) %>%
         gather(Var, ColA, -Col_B) %>%
         group_by(ColA) %>%
         summarise(Freq=n(),Col_C= sum(Col_B))
#   ColA  Freq Col_C
#  (chr) (int) (int)
#1 textA     1    10
#2 textB     2    30
#3 textC     2    50
#4 textD     2    70
#5 textE     2    60
#6 textF     1    20

Или с параметрами base R, разделив «Col_A» по пробелу, скопируйте «Col_B» с помощью lengths list вывода из «lst», чтобы создать data.frame, а затем используйте aggregate, чтобы получить length и sum из «Col_B».

lst <- strsplit(df1$Col_A, " ")
d1 <- data.frame(Col_A= unlist(lst), Col_C=rep(df1$Col_B, lengths(lst)))
do.call(data.frame, aggregate(.~Col_A, d1, function(x) c(length(x), sum(x))))
person akrun    schedule 08.04.2016