【问题标题】:R - sum value and merge column based on conditionR - 根据条件求和并合并列
【发布时间】:2018-05-30 20:59:09
【问题描述】:

我有以下数据框:

df1 <- data.frame( id = c(1,2,2,3),
                   word = c("house, garden, flower", "flower, red", "garden, tree, forest", "house, window, door, red"),
                   value = c(10,12,20,5),
                   stringsAsFactors = FALSE
)

现在我想根据 id 合并行。所以如果有重复的id,则应该合并列word中的值,并对列值求和。这意味着 df 应该如下所示:

id | word                              | value
1  | house, garden, flower             | 10
2  | flower, red, garden, tree, forest | 32
3  | house, window, door, red          | 5

有人知道如何解决这个问题吗?

【问题讨论】:

  • id == 2的值应该是32吧?
  • 你是对的!对不起,我更正了。

标签: r merge sum


【解决方案1】:

在基础 R 中:

df1 <- data.frame( id = c(1,2,2,3),
                   word = c("house, garden, flower", "flower, red", "garden, tree, forest", "house, window, door, red"),
                   value = c(10,12,20,5),
                   stringsAsFactors = FALSE
)

want <- data.frame(id = unique(df1$id),
                   word = tapply(df1$word, df1$id, paste, collapse = ", "),
                   value = tapply(df1$value, df1$id, sum))
want

  id                              word value
1  1             house, garden, flower    10
2  2 flower, red, garden, tree, forest    32
3  3          house, window, door, red     5

【讨论】:

    【解决方案2】:

    使用dplyr 包就像这样:

    library(dplyr)
    
    df1 %>%
      group_by(id) %>%
      summarise(
        word = paste(word, collapse = ', '),
        value=sum(value)
      )
    

    输出:

    # A tibble: 3 x 3
         id word                              value
      <dbl> <chr>                             <dbl>
    1    1. house, garden, flower               10.
    2    2. flower, red, garden, tree, forest   32.
    3    3. house, window, door, red             5.
    

    【讨论】:

    • 我不知道我做错了什么,但是使用此代码,所有单词都放在一行中,而不是按 id 排序。所以我得到了一个只有一行的df:单词和值,一切都被总结了。我只是复制粘贴你的代码......
    【解决方案3】:

    使用tidyverse 非常简单。只需按id 分组,然后使用summarize 函数生成您想要的分组变量:

    library(tidyverse)
    df1 %>%
        group_by(id) %>%
        dplyr::summarize(word = paste0(word, collapse=", "),
                  value = sum(value))
    
         id word                              value
      <dbl> <chr>                             <dbl>
    1     1 house, garden, flower                10
    2     2 flower, red, garden, tree, forest    32
    3     3 house, window, door, red              5
    

    【讨论】:

    • 我不知道我做错了什么,但是使用此代码,所有单词都放在一行中,而不是按 id 排序。所以我得到了一个只有一行的df:单词和值,一切都被总结了。我只是复制粘贴你的代码......
    • 你已经加载了包plyr,所以你正在使用那个版本的summarize。如果您指定dplyr::summarize 或卸载该包,那么它将按预期工作。
    猜你喜欢
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    • 2018-11-25
    • 1970-01-01
    相关资源
    最近更新 更多