【问题标题】:How to use dplyr to group by column and then add another more如何使用 dplyr 按列分组,然后再添加另一个
【发布时间】:2018-02-09 09:47:18
【问题描述】:

我最近开始训练自己进行情绪分析。我有一个如下所示的数据集:initial data

原始数据包括对葡萄酒的评论,每行一个。我所做的是对其进行标记并使用其中一个 R 词典执行基本的情感分析。如屏幕截图所示。 X 列是指初始数据框中的原始行。我现在要做的是计算净效应(查看每行的主要影响是正数还是负数,但是每个原始行(X)的数字并将其作为一列附加)。 我已尝试使用以下代码,但它不起作用:

per_row <- unigrams_all_ns %>%
inner_join(get_sentiments("bing"),by=c("unigram"="word"))%>%
group_by(X)%>%
spread(sentiment, n, fill = 0)

我收到以下错误

错误:var 必须计算为单个数字或列名,而不是函数

【问题讨论】:

  • 请展示一个可重现的小例子和预期的输出
  • 欢迎来到 StackOverflow!请阅读有关how to ask a good question 的信息以及如何提供reproducible example。这将使其他人更容易帮助您。
  • 我觉得你先总结再传播group_by(X, sentiment) %&gt;% summarise(n = n()) %&gt;% spread(sentiment, n, fill = 0)
  • 我对你的说法有点困惑。你的意思是你想知道X的每个级别有多少正面和负面的词?如果是这样,count(X, sentiment) 将在您的代码中跟随 inner_join()。如果你想要一个宽格式的数据,你可以在count()之后使用spread(key = sentiment, value = n, fill = 0)
  • @Vova 谢谢你的魅力。

标签: r dplyr sentiment-analysis


【解决方案1】:

您要做的是计算X 中每个组存在多少肯定词和否定词。您可以在 dplyr 包中使用count()。鉴于您尝试执行的操作,您似乎希望获得宽格式数据。所以我使用了spread()。我认为您可以自己从这里做更多的事情。

library(dplyr)
library(tidyr)
library(tidytext)

unigrams_all_ns <- data.frame(X = c(1,2,2,2,2,3,3,3,4,4),
                              unigram = c("smooth", "snappy", "dominate", "crisp", "stainless", "lemon", 
                                          "blossom", "opulent", "rough", "pleasantly"),
                              stringsAsFactors = FALSE)

unigrams_all_ns %>%
inner_join(get_sentiments("bing"), by =c("unigram" = "word"))%>%
count(X, sentiment) %>%
spread(key = sentiment, value = n, fill = 0)

      X negative positive
  <dbl>    <dbl>    <dbl>
1  1.00     0        1.00
2  2.00     0        4.00
3  3.00     1.00     2.00
4  4.00     1.00     1.00

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    • 2022-11-14
    • 2012-10-05
    • 2020-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多