【问题标题】:Remove duplicates but keeping values in R删除重复项但将值保留在 R 中
【发布时间】:2017-03-13 05:15:24
【问题描述】:

我有一个包含重复商店/产品组合的数据框。我想删除重复的值,但我想保留这些产品每年的成本。

示例数据框:

store    product    year1  year2  year3 
H&M      shirt      20.00  29.95  NA
Mango    trousers   49.95  NA     NA
H&M      trousers   39.95  NA     39.95
Mango    trousers   NA     NA     44.95

我希望数据集看起来如何:

store    product    year1  year2  year3 
H&M      shirt      20.00  29.95  NA
H&M      trousers   39.95  NA     39.95
Mango    trousers   49.95  NA     44.95

我使用过 dplyr,但这似乎只是删除了重复项,而不是保留所有成本值。任何帮助表示赞赏!

可重现的代码:

df <- data.frame(store= c("H&M", "Mango", "H&M", "Mango"), product=c("shirt", "trousers", "trousers", "trousers"), 
                 year1=c(20.95, 49.95, 39.95, NA), year2=c(29.95, NA, NA, NA), year3=c(NA,NA,39.95, 44.95))

【问题讨论】:

    标签: r duplicates


    【解决方案1】:

    确实dplyr 是要走的路。 首先是 gather() 数据,然后是 group_by()summarize(),最后是 spread(),在缺失的地方填充 NA,即:

    library(dplyr)
    df <- data.frame(store= c("H&M", "Mango", "H&M", "Mango"), 
                     product=c("shirt", "trousers", "trousers", "trousers"), 
                     year1=c(20.95, 49.95, 39.95, NA), 
                     year2=c(29.95, NA, NA, NA), 
                     year3=c(NA,NA,39.95, 44.95))
    new.df <- df %>%
      gather(year, value, -store, -product) %>%
      group_by(year, store, product) %>%
      summarize(sum.value = sum(value)) %>%
      spread(key = year, value = sum.value, fill = NA)
    

    使用-store-product 告诉gather() 忽略这两个变量并按年份收集数据并将新的数字列称为“值”(您可以将其替换为您喜欢的任何名称)。

    然后group_by()summarize() 确保我们不会遇到重复(并使用两个值的总和,以防有很多行与同一商店和产品相关)。

    最终spread() 提供了您正在寻找的表格。

    您必须小心处理重复项以及您对它们的假设。这个答案假设如果有两行具有相同的产品和商店,出现两次,那么你想要的结果是 year1 的总和、year2 的总和和 year3 的总和。如果存在 NA(在group_by() 组中,您将得到一个 NA,除非您在 sum 命令中添加 na.rm = TRUE,即:summarize(sum.value = sum(value, na.rm = TRUE))。那么您将有 0 而不是 NA。

    但是,我提供的代码适用于您提供的示例,并产生您想要的 tibble。

    【讨论】:

      【解决方案2】:

      您可以使用包 dplyr

      dfn<- df %>%
        group_by(store, product) %>%
        summarise(year1 = sum(year1, na.rm = T),
                  year2 = sum(year2, na.rm = T),
                  year3 = sum(year3, na.rm = T))
      

      当你打印出 dfn 时,你会得到

         store  product year1 year2 year3
        <fctr>   <fctr> <dbl> <dbl> <dbl>
      1    H&M    shirt 20.95 29.95  0.00
      2    H&M trousers 39.95  0.00 39.95
      3  Mango trousers 49.95  0.00 44.95
      

      您想按两个变量进行分组,所以group_by 函数最适合它。我知道您希望 NA 用于 0 所在的位置,您可以在后续行中将其替换为

      dfn[dfn == 0, ] <- NA
      

      【讨论】:

        猜你喜欢
        • 2019-10-27
        • 2022-10-04
        • 1970-01-01
        • 2019-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-19
        相关资源
        最近更新 更多