R汇总另一个数据帧中的重复行

时间:2018-01-29 10:17:08

标签: r dataframe sum

我有两个这样的数据框

dat1 = data.frame("name" = c("Peter", "Tom", "Peter", "Peter", "Tom"), "adress" = c("str1", "str2", "str1", "str2", "str3"), "product" = c("prod1", "prod1", "prod2", "prod3", "prod2"), "val" = c(1,2,3,4,5))
dat2 = data.frame("name" = c("Tom", "Tom", "Peter", "Peter"), "adress" = c("str2", "str3", "str1", "str2"))

我想要做的是,为'dat2'的每一行求和'dat1'中列'val'的所有值,它们与列'name'和'adress'中的值匹配。 另外,如果'prod'在矢量中,我只想将'dat1'中的值相加,例如%in% c("prod1", "prod2")

我不知道怎么做,除了fpr循环遍历'dat2'的每一行并创建'dat1'的子集数据帧,其中我可以对列'val'求和。但我的数据框架非常大,所以我觉得这不是个好主意。

这是我想要的输出:

result = data.frame("name" = c("Tom", "Tom", "Peter", "Peter"), "adress" = c("str2", "str3", "str1", "str2"), val = c(2,5,4,NA))

2 个答案:

答案 0 :(得分:0)

使用的解决方案。我们可以在dat1中汇总值,然后对dat2执行连接。 dat3是最终结果。

library(dplyr)

# Create a vector
vec <- c("prod1", "prod2")

# Summarize in dat1
dat1_2 <- dat1 %>%
  filter(product %in% vec) %>%
  group_by(name, adress) %>%
  summarize(val = sum(val)) %>%
  ungroup()

# Join dat2 and dat1_2
dat3 <- dat2 %>% left_join(dat1_2, by = c("name", "adress")) 
dat3
#    name adress val
# 1   Tom   str2   2
# 2   Tom   str3   5
# 3 Peter   str1   4
# 4 Peter   str2  NA

答案 1 :(得分:0)

解决方案可能是首先合并data.frame,然后使用data.table库执行所需的操作:

library(data.table)

tmp <- as.data.table(merge(dat1,dat2,by=c("name","adress")))
tmp[product%in%c("prod1","prod2"),total:=sum(val),by=c("name","adress")]
tmp[,c("product","val"):=NULL]
tmp <- unique(tmp)


> tmp
    name adress total
1: Peter   str1     4
2: Peter   str2    NA
3:   Tom   str2     2
4:   Tom   str3     5