删除重复项但保留R中的值

时间:2017-03-12 20:13:33

标签: r duplicates

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

示例数据框:

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))

2 个答案:

答案 0 :(得分:1)

您可以使用 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函数最适合它。我知道您希望NAs在0的位置,您可以在后续行中将其替换为

dfn[dfn == 0, ] <- NA

答案 1 :(得分:1)

确实dplyr是要走的路。 首先,您gather()数据,然后是group_by()summarize(),最后是spread(),填写缺失的NAs,即:

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()忽略这两个变量并按年收集数据并调用新的数字列&#34; value&#34; (你可以用你喜欢的名字替换它。)

然后group_by()summarize()确保我们不会遇到重复项(如果有许多行与同一商店和产品相关,则使用两个值的总和)。< / p>

最终spread()会提供您要找的表单。

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

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