我有两个这样的数据框
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))
答案 0 :(得分:0)
使用dplyr的解决方案。我们可以在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