【问题标题】:How to extract and sum distinct values in from a column and create a column with the sum如何从列中提取和求和不同的值并使用总和创建列
【发布时间】:2021-06-07 18:51:49
【问题描述】:

我正在尝试创建一个列,它是列 SIZE 的唯一值的总和

TYPE    SIZE
A   24522145.17
A   35359867.65
A   35359867.65
A   35359867.65
A   35359867.65
A   35359867.65
A   24522145.17
A   35359867.65
A   35359867.65
A   8527174.786

我不想要唯一值的计数,而是总和,总和之上的数据将添加 (24522145.17 + 35359867.65 + 8527174.786)。这是在按变量 TYPE 分组之后。 谢谢!

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我们按“TYPE”分组,获取unique“SIZE”并返回sum中的sumsummarise

    library(dplyr)
    df1 %>%
        group_by(TYPE) %>%
         summarise(Sum = sum(unique(SIZE), na.rm = TRUE))
    

    -输出

    # A tibble: 1 x 2
      TYPE        Sum
      <chr>     <dbl>
    1 A     68409188.
    

    数据

    df1 <- structure(list(TYPE = c("A", "A", "A", "A", "A", "A", "A", "A", 
    "A", "A"), SIZE = c(24522145.17, 35359867.65, 35359867.65, 35359867.65, 
    35359867.65, 35359867.65, 24522145.17, 35359867.65, 35359867.65, 
    8527174.786)), class = "data.frame", row.names = c(NA, -10L))
    

    【讨论】:

    • 谢谢!它有效,但是即使行数不匹配,是否可以创建一列并将其添加到现有数据集中?我尝试使用您的代码进行变异,但没有成功。
    • @DSan 只需将其更改为 mutatedf1 &lt;- df1 %&gt;% group_by(TYPE) %&gt;% mutate(Sum = sum(unique(SIZE), na.rm = TRUE))。行数无关紧要,因为sum 只是一个数字,它会被回收到每个组的长度
    【解决方案2】:

    我们还可以获得不同的组合并使用count 将它们相加,其中wt 是我们想要求和的值。

    library(dplyr)
    df1 %>%
      distinct(TYPE, SIZE) %>%
      count(TYPE, wt = SIZE)  # shortcut for group_by(TYPE) %>% summarize(n = sum(SIZE))
    

    数据

    df1 <- data.frame(
      stringsAsFactors = FALSE,
                  TYPE = c("A", "A", "A", "A", "A", "A", "A", "A", "A", "A"),
                  SIZE = c(24522145.17,35359867.65,
                           35359867.65,35359867.65,35359867.65,35359867.65,
                           24522145.17,35359867.65,35359867.65,8527174.786)
    )
    

    【讨论】:

    • 我喜欢这种方法!你能解释一下wt!点赞+!
    • 根据文档,count() 为每个组计算 sum(wt)
    【解决方案3】:

    我们可以使用filter!duplicated()

    df1 %>% 
      group_by(TYPE) %>% 
      filter(!duplicated(SIZE)) %>% 
      summarise(sum = sum(SIZE))
    

    输出:

      TYPE        sum
      <chr>     <dbl>
    1 A     68409188.
    

    【讨论】:

      【解决方案4】:

      使用您正确格式化的数据

      tibble::tribble(
        ~TYPE, ~SIZE,
        "A",   24522145.17,
        "A",   35359867.65,
        "A",   35359867.65,
        "A",   35359867.65,
        "A",   35359867.65,
        "A",   35359867.65,
        "A",   24522145.17,
        "A",   35359867.65,
        "A",   35359867.65,
        "A",   8527174.786
      ) -> df
      

      你可以做(​​h/t @akrun)

      aggregate(SIZE ~ TYPE, unique(df), sum)
      

      返回

        TYPE     SIZE
      1    A 68409188
      

      【讨论】:

      • 根据问题,结果应该是(24522145.17 + 35359867.65 + 8527174.786) ~ 68409188
      • 对,sum 而不是mean。已更正,谢谢@akrun!
      • @ktiu 对不起,我的意思只是这样,但可能会分心。谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多