【问题标题】: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 来做到这一点?

谢谢!

【问题讨论】:

    标签: r dplyr tidyverse aggregation


    【解决方案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
        

        【讨论】:

          猜你喜欢
          相关资源
          最近更新 更多