如何按组对变量求和

Posted

技术标签:

【中文标题】如何按组对变量求和【英文标题】:How to sum a variable by groups 【发布时间】:2021-02-11 07:21:19 【问题描述】:

所以,我有一个样本数据

structure(list(Conversation = c(1L, 1L, 2L, 2L, 3L, 3L, 1L, 1L, 
2L, 2L, 3L, 3L), ID.Number = c("ID 11", "ID 11", "ID 11", "ID 11", 
"ID 11", "ID 11", "ID 14", "ID 14", "ID 14", "ID 14", "ID 14", 
"ID 14"), Swear.word = c(0L, 2L, 4L, 3L, 0L, 0L, 1L, 0L, 3L, 
1L, 0L, 4L)), class = "data.frame", row.names = c(NA, -12L))

而且,我正在尝试得到一个看起来像这样的结果

structure(list(IDNumber = c(11L, 14L), Convo1 = 2:1, Convo2 = c(7L, 4L), Convo3 = c(0L, 4L)), class = "data.frame", row.names = c(NA, -2L))

因此,基本上,我试图查看每个参与者按会话类型 (convo#) 的脏话使用情况(单词使用总和)。

如何使用 R 来做到这一点?

谢谢!

【问题讨论】:

【参考方案1】:

试试这个tidyverse 方法。我使用共享为A 的数据。您可以在一个代码镜头中使用pivot_wider() 以获得所需的结果。代码如下:

library(tidyverse)
#Code
New <- A %>% mutate(Conversation=paste0('Conv.',Conversation)) %>%
  pivot_wider(names_from = Conversation,values_from=Swear.word,values_fn = sum)

输出:

# A tibble: 2 x 4
  ID.Number Conv.1 Conv.2 Conv.3
  <chr>      <int>  <int>  <int>
1 ID 11          2      7      0
2 ID 14          1      4      4

最佳代码截图可以是(非常感谢@starja):

#Code 2
Newdf <- A %>% pivot_wider(names_from = Conversation,
                  values_from=Swear.word,
                  values_fn = sum,names_prefix='Conv.')

输出:

# A tibble: 2 x 4
  ID.Number Conv.1 Conv.2 Conv.3
  <chr>      <int>  <int>  <int>
1 ID 11          2      7      0
2 ID 14          1      4      4

【讨论】:

智能使用values_fn!要只使用pivot_wider,您可以使用names_prefix @starja 很好的建议,让我为你添加那篇文章!【参考方案2】:

这应该可以工作

library(tidverse)


df <- x %>%
    group_by(ID.Number, Conversation) %>%
    summarize(
        total = sum(Swear.word, na.rm = TRUE)
    ) %>%
    spread(Conversation, total) %>%
    magrittr::set_colnames(c("IDNumber","Convo1","Convo2", "Convo3"))
df

【讨论】:

【参考方案3】:

这是dplyrtidyrstringr的方法:

library(dplyr)
library(tidyr)
library(stringr)

data %>% 
  mutate(ID.Number = as.integer(str_extract(ID.Number, "\\d+"))) %>% 
  group_by(ID.Number, Conversation) %>% 
  summarise(count = sum(Swear.word)) %>% 
  pivot_wider(
    id_cols = ID.Number,
    names_from = Conversation,
    values_from = count,
    names_prefix = "Convo"
  ) %>% 
  rename(IDNumber = ID.Number)
# A tibble: 2 x 4
# Groups:   IDNumber [2]
  IDNumber Convo1 Convo2 Convo3
     <int>  <int>  <int>  <int>
1       11      2      7      0
2       14      1      4      4

【讨论】:

【参考方案4】:

我们可以从base R使用xtabs

xtabs(Swear.word ~ ID.Number + Conversation, df1)
#        Conversation
#ID.Number 1 2 3
#    ID 11 2 7 0
#    ID 14 1 4 4

或者使用来自data.tabledcast

library(data.table)
dcast(setDT(df1), ID.Number ~ paste0('Conv.', Conversation), 
     value.var = 'Swear.word', sum)
#   ID.Number Conv.1 Conv.2 Conv.3
#1:     ID 11      2      7      0
#2:     ID 14      1      4      4

【讨论】:

以上是关于如何按组对变量求和的主要内容,如果未能解决你的问题,请参考以下文章

如何按组对变量求和

如何按组对变量求和

在 R 中:如何在两个日期之间按组对变量求和

一次调用按组对多个变量应用多个汇总函数

R按两组对变量求和[重复]

如何拆分-应用-组合 R 中的多个变量/列