我有一个包含重复商店/产品组合的数据框。我想删除重复的值,但我想保留每年这些产品的成本。
示例数据框:
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))
答案 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。