summarise_each для двух переменных

У меня есть кадр данных, который выглядит примерно так:

df <- data.frame(
    text = c(1:12),
    person = c(c(rep("John", 6)), c(rep("Jane", 6))),
    lemma  = c("he", "he", "he", "his", "it", "she", "he",
           "she", "she", "his", "it", "she"),
    n = c(8, 8, 3, 7, 10, 4, 12, 9, 3, 4, 2, 8),
    total_words = c(20, 49, 19, 39, 40, 30, 13, 30, 20, 34, 33, 15))

Что я пытаюсь сделать, так это получить сводную статистику, чтобы я мог определить относительную частоту каждого местоимения во всех текстах, созданных Джоном и Джейн соответственно. Если бы все, что я хотел, это подсчеты, это было бы легко:

library("dplyr")
library("tidyr")
df %>%
   group_by(person, lemma) %>%
   summarise_each(funs(sum), n) %>%
   spread(lemma, n)

Однако, как я уже сказал, мне нужна относительная частота, поэтому мне нужно разделить приведенные выше результаты на общее количество слов во всех текстах, созданных Джоном и Джейн соответственно. Получить проценты также легко:

df %>%
group_by(lemma) %>%
summarise_each(funs(sum), n, total_words) %>%
mutate(percentage = n / total_words)

Я хочу заменить общее количество в первом примере процентами во втором примере, и именно здесь я застрял.


person JoeF    schedule 06.02.2015    source источник
comment
вы, вероятно, должны добавить ожидаемый результат   -  person eddi    schedule 06.02.2015
comment
Спасибо. Я далеко от своего компьютера, но я пытаюсь получить общую сумму, скажем, слов Джона по всем шести его текстам, разделенную на общую сумму всех его слов (то есть сумму общее количество слов total_words во всех шести его текстах, но я хочу это для его местоимений и всех ее местоимений. Я могу получить либо количество местоимений, произведённых Джоном и Джейн, либо процентное соотношение для всех местоимений, но я не могу получить два в одной таблице.   -  person JoeF    schedule 06.02.2015


Ответы (1)


Я задал этот вопрос в manipulaR google, и Брэндон Херр дал мне ответ, который я подправил, чтобы получить окончательную форму, которую я хотел. Вот он, на случай, если кто-то еще обнаружит, что ему нужно сделать что-то подобное:

wordPerson <- df %>%
  group_by(person) %>%
  summarise(sumWords = sum(total_words))

df %>%
   group_by(lemma, person) %>%
   summarise_each(funs(sum), n, total_words) %>%
   inner_join(., wordPerson, by = "person") %>%
   mutate(percentage = n / sumWords) %>%
   select(person, lemma, percentage) %>%
   spread(lemma, percentage)

Короче говоря, вам нужно сделать это в два этапа.

person JoeF    schedule 07.02.2015