基于R中的两个条件查找对应的值

问题描述 投票:1回答:2

我有两个数据框

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))
r matching multiple-conditions
2个回答
1
投票

涉及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中的两列与错字同名。


0
投票

我们可以使用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

注意:未使用外部软件包

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.