首页 > 解决方案 > 如何在具有两列共同的两个不同数据集中查找单个值(基于条件)

问题描述

我有两个不同的数据集,如下所示: 在此处输入图像描述

当且仅当:两个数据集中的 ID 和日期列都匹配时,我需要在数据集 #2 中添加调用量、放置量和总量列。我根据数据集 #1 中第 3 列中的值(C 代表调用,P 代表看跌,T 代表总计)来区分看涨、看跌和总计。

我正在运行此代码,但它不起作用(仅显示调用示例,同样的规则适用于 put 和 totals)。

dataset2$call_volume <- if(dataset1$optiontype== "C")
{ dataset1$volume [ match (
                          interaction(dataset2$ID,dataset2$date),
                          interaction(dataset1$ID,dataset1$date)
                                         )]}

有没有人建议我如何继续使用代码?非常感谢!

> dput(dataset1)
structure(list(ID = c(44652, 44652, 44652, 56266, 56266, 56266, 
44652, 44652, 44652, 56266, 56266, 56266), date = c("1997/01/02", 
"1997/01/02", "1997/01/02", "1997/01/02", "1997/01/02", "1997/01/02", 
"1997/01/03", "1997/01/03", "1997/01/03", "1997/01/03", "1997/01/03", 
"1997/01/03"), `option type (C,P,T: for calls, puts, and total)` = c("C", 
"P", "T", "C", "P", "T", "C", "P", "T", "C", "P", "T"), volume = c(34, 
250, 284, 30, 0, 30, 1443, 211, 1654, 4490, 826, 5316)), row.names = c(NA, 
-12L), class = c("tbl_df", "tbl", "data.frame"))

> dput(dataset2)
structure(list(ID = c(44652, 44652, 44652, 56266, 56266, 56266
), date = c("1997/01/02", "1997/01/03", "1997/01/04", "1997/01/02", 
"1997/01/03", "1997/01/04"), `call volume` = c(NA, NA, NA, NA, 
NA, NA), `put volume` = c(NA, NA, NA, NA, NA, NA), `total volume` = c(NA, 
NA, NA, NA, NA, NA)), row.names = c(NA, -6L), class = c("tbl_df", 
"tbl", "data.frame"))

更新:我在两个数据集中还有许多其他列彼此完全不同,唯一常见的是下面图片和数据集中显示的列。

标签: rmatchlookupmatching

解决方案


我认为这是一个 x/y 问题。我认为您实际上是在尝试转换dataset1为宽格式来填充dataset2. 在此之后,你可以left_join两帧。

library(tidyr)
library(dplyr)

names(dataset1)[3] <- "option_type"

dataset2 %>% 
  dplyr::select(-`call volume`, -`put volume`, -`total volume`) %>%
  left_join(dataset1 %>% 
  tidyr::pivot_wider(names_from = "option_type", values_from = "volume") %>%
  rename("Call Volume" = C, "Put Volume" = P, "Total Volume" = `T`),
  by = c("ID", "date"))
#> # A tibble: 6 x 5
#>      ID date       `Call Volume` `Put Volume` `Total Volume`
#>   <dbl> <chr>              <dbl>        <dbl>          <dbl>
#> 1 44652 1997/01/02            34          250            284
#> 2 44652 1997/01/03          1443          211           1654
#> 3 44652 1997/01/04            NA           NA             NA
#> 4 56266 1997/01/02            30            0             30
#> 5 56266 1997/01/03          4490          826           5316
#> 6 56266 1997/01/04            NA           NA             NA

reprex 包于 2020-10-07 创建(v0.3.0)


推荐阅读