【问题标题】:Finding the corresponding values based on two criteria in R根据 R 中的两个标准查找相应的值
【发布时间】:2020-05-19 15:44:43
【问题描述】:

我有两个数据框

df1 <- data.frame(Region = c(1:5), Code = c(10,11,12,15,15), date = c("2018-12","2018-11","2019-01","2019-01","2019-02"))
df2 <- data.frame(Code = c(10,11,12,13,14,15,16,17,18,19),"2018-10" = c(50:59),"2018-11" = c(20:29),"2018-12" = c(25:34),"2019-01" = c(32:41),"2019-01" = c(40:49),"2019-02" = c(40:49))

我想在df3中匹配并存储df1$Region的对应值。

结果应该如下所示

df3 <- data.frame(Region = c(1:5),Results=c(25,21,34,45,45))

【问题讨论】:

  • 对于第二个数据集,您显示两列具有相同的列名"2019-01" = c(32:41),"2019-01" = c(40:49)

标签: r matching multiple-conditions


【解决方案1】:

我们可以使用row/column索引来提取值,通过match将“代码”列作为行索引,并使用两个数据集的“日期/列名”来获取列索引(不使用任何外部软件包)

cbind(df1['Region'], Results = df2[-1][cbind(match(df1$Code, df2$Code), 
        match(df1$date,
         sub('^X(\\d{4})\\.', "\\1-", names(df2)[-1])))])
#  Region Results
#1      1      25
#2      2      21
#3      3      34
#4      4      37
#5      5      45

注意:OP 帖子中的列名称以 ^X 开头,其格式为 . 而不是 -,因为它是使用 check.names = TRUE 创建的(默认)


如果数据集是用check.names = FALSE创建的,上面的解决方案可以进一步简化

cbind(df1['Region'], Results = df2[-1][cbind(match(df1$Code, df2$Code),
           match(df1$date, names(df2)[-1]))])
#  Region Results
#1      1      25
#2      2      21
#3      3      34
#4      4      37
#5      5      45

更新

如果列名重复并且希望根据该信息进行匹配,则

i1 <- duplicated(df1$date)
v1 <- numeric(nrow(df1))
v1[!i1] <- df2[-1][cbind(match(df1$Code[!i1], 
             df2$Code),match(df1$date[!i1], names(df2)[-1]))]
v1[i1] <- rev(df2[-1])[cbind(match(df1$Code[i1], 
            df2$Code),match(df1$date[i1], rev(names(df2)[-1])))]
cbind(df1['Region'], Results = v1)
#   Region Results
#1      1      25
#2      2      21
#3      3      34
#4      4      45
#5      5      45

注意:没有使用外部包

【讨论】:

    【解决方案2】:

    涉及dplyrtidyr 的选项可能是:

    df1 %>%
     inner_join(df2 %>%
                 pivot_longer(-Code), by = c("Code" = "Code",
                                             "date" = "name"))
    
    
      Region Code    date value
    1      1   10 2018-12    25
    2      2   11 2018-11    21
    3      3   12 2019-01    34
    4      4   15 2019-01    37
    5      5   15 2019-02    45
    

    我认为 df2 中的两列名称与拼写错误相同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多