【问题标题】:How to find the sum of a column based on another column and put it into a new dataframe In R如何根据另一列查找一列的总和并将其放入R中的新数据框中
【发布时间】:2021-04-25 22:08:54
【问题描述】:

我有一个像这样的大数据框。

Name Gender Count Probability
James M 12345 0.012313
John M 12334 0.012314
Robert M 12300 0.0124
Michael M 12222 0.13
William M 12121 0.123131
Mary F 10002 0.123112

我想知道如何获得以数据帧中每个字母开头的所有名称的计数总和,并创建一个看起来像这样的新数据帧

Name Count
A    22222
B    44444
C    66666

【问题讨论】:

    标签: r


    【解决方案1】:

    最好用dput提供数据:

    df <- structure(list(Name = c("James", "John", "Robert", "Michael", 
    "William", "Mary"), Gender = c("M", "M", "M", "M", "M", "F"), 
        Count = c(12345L, 12334L, 12300L, 12222L, 12121L, 10002L), 
        Probability = c(0.012313, 0.012314, 0.0124, 0.13, 0.123131, 
        0.123112)), class = "data.frame", row.names = c(NA, -6L))
    

    那就用xtabs:

    Letter <- substr(df$Name, 1, 1)    
    xtabs(Count~Letter, df)
    # Letter
    #     J     M     R     W 
    # 24679 22224 12300 12121 
    

    或者,如果您希望将其垂直组织为 data.frame

    data.frame(xtabs(Count~Letter, df))
    #   Letter  Freq
    # 1      J 24679
    # 2      M 22224
    # 3      R 12300
    # 4      W 12121
    

    【讨论】:

    • 有没有办法将索引更改为数字并将字母放在自己的单独列中?
    【解决方案2】:

    我认为你可以使用这个解决方案:

    library(dplyr)
    library(stringr)
    
    df %>%
      mutate(initial = str_sub(Name, 1L, 1L)) %>%
      group_by(initial) %>%
      summarise(count = sum(Count, na.rm = TRUE)) %>%
      as.data.frame()
    
      initial count
    1       J 24679
    2       M 22224
    3       R 12300
    4       W 12121
    
    

    数据

    df <- tribble(
      ~Name,    ~Gender,    ~Count,     ~Probability,
      "James",  "M",    12345,  0.012313,
      "John",   "M",    12334,  0.012314,
      "Robert",     "M",    12300,  0.0124,
      "Michael",    "M",    12222,  0.13,
      "William",    "M",    12121,  0.123131,
      "Mary",   "F",    10002,  0.123112
    )
    
    

    【讨论】:

    • 如何将生成的 tibble 转换为 dataFrame?
    • 为什么是rowwise?这个df %&gt;% group_by(initial = str_sub(Name, 1L, 1L)) %&gt;% summarise(count = sum(Count, na.rm = TRUE)) 将给出相同的结果
    • @J.corn tibble 也是一个数据框。唯一的区别是它有更好的输出并共享一些关于变量类型和维度的信息。但是,如果您想拥有一个经典的数据框,我为此编辑了我的代码。
    • @AnilGoyal 我认为这是必要的,因为我正在执行逐行操作,但看来你是对的。
    • 即使你没有额外的mutate,如果变量刚刚被修改为group_by,你可以直接在group_by中创建它,从而节省一行多余的代码
    【解决方案3】:

    使用 baseR aggregate

    aggregate(Count ~ substr(Name, 1, 1), df, sum)
    
      substr(Name, 1, 1) Count
    1                  J 24679
    2                  M 22224
    3                  R 12300
    4                  W 12121
    

    【讨论】:

      【解决方案4】:

      您可以在基础 R 中使用 tapply

      with(df, tapply(Count, substr(Name, 1, 1), sum))
      

      或者如果我们希望输出为数据框。

      stack(with(df, tapply(Count, substr(Name, 1, 1), sum)))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-09
        相关资源
        最近更新 更多