【问题标题】:How to merge multiple data frame with different criteria in one step by using condition statement如何使用条件语句一步合并多个具有不同条件的数据框
【发布时间】:2016-06-15 18:26:27
【问题描述】:

我目前正在处理下面列出的四个多数据框。

  • tmp:主表(变量包括:组、重量、国家、收入)
  • price1:组 1 - 3 的价格表 1(包括变量:组、重量、价格)
  • price2:组 4 - 8 的价格表 2(包括变量:组、价格)
  • price3:第 9 组的价格表 3(变量包括:组、国家、重量、价格)

“重量”是一个从1到200的整数变量。在价格表1和3中,每个“重量”都有一个价格值。

我想保持主表不变,并有条件地将价格表 1、2、3 合并到它。主表中的“组”变量范围从 1 到 9。价格表也基于“组”值进行管理。每个值代表一个单一的产品。同一价格表中的产品性质相似,价格不同。但是,跨价格表的产品具有不同的性质。由于这种差异,合并标准也不同。

此次合并的目的是比较不同产品的收入和价格。

以下是主表和3价格表的合并条件。

  • 价格表 1 到主表的主键:组和重量
  • 价格表 2 到主表的主键:组
  • 价格表 3 到主表的主键:组 & 国家 & 重量

使用代码:

test <- ifelse(tmp$group %in% c(1,2,3), merge(tmp,price1,by=c("group","weight"))
            ,ifelse(tmp$group %in% c(4,5,6,7,8),merge(tmp, price2, by= "group")
                   ,merge(tmp,price3, by=c("group","country","weight")))))

我的代码的问题是返回对象不是数据框,它在 R 中显示为一个大列表。

【问题讨论】:

标签: r merge conditional


【解决方案1】:

如果我没有理解错,您是在价格数据框架中查找主数据中的产品价格。由于这些组在您的示例中是独一无二的,因此最好先合并价格 data.frames,然后再与您的主数据合并。

数据:

price1 <- data.frame(group=1:3, weight=sample(1:200, 3, replace=T), price=abs(rnorm(3, 15, 1)))
price2 <- data.frame(group=4:8, price=abs(rnorm(5, 15, 1)))
price3 <- data.frame(group=9, country="A", weight=sample(1:200, 1), price=abs(rnorm(1, 15, 1)))
tmp <- data.frame(group=1:10, weight=sample(1:200, 10, replace=T), country=sample(LETTERS, 10, replace=T), revenue=abs(rnorm(10, 150, 2)))

将三个价格data.frame与plyr::ldply合并

library(plyr)
price <- plyr::ldply(list(price1, price2, price3))

合并后的价格data.frame只保留两列:

library(dplyr)
price <- price %>% select(price, group)

按组加入主data.frame和价格

output <- tmp %>% left_join(price, by="group")
   group weight country  revenue    price
1      1    196       N 149.4803 15.52752
2      2     55       L 150.3930 15.98541
3      3     78       E 150.6139 14.95468
4      4     62       D 151.4679 16.51612
5      5    107       Q 149.3292 15.59761
6      6    168       C 148.8256 14.49331
7      7    193       L 149.0341 16.31310
8      8     18       X 152.9192 14.06301
9      9    113       O 147.0069 14.08821
10    10    197       H 149.3581       NA

【讨论】:

  • 谢谢。亚当。最好先合并价格表。
【解决方案2】:

考虑对子集的 tmp 数据帧进行行绑定,每个数据帧都与价格数据帧合并:

test <- rbind(merge(tmp[tmp$group %in% c(1,2,3),], price1, by=c("group","weight")),
              merge(tmp[tmp$group %in% c(4,5,6,7,8),], price2, by="group"),
              merge(tmp[tmp$group == 9,], price3, by=c("group","country","weight")))

【讨论】:

    猜你喜欢
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    • 2015-07-27
    • 2021-07-31
    • 1970-01-01
    相关资源
    最近更新 更多