首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于R中的两个准则求出相应的值

基于R中的两个准则求出相应的值
EN

Stack Overflow用户
提问于 2020-02-03 20:37:15
回答 2查看 47关注 0票数 2

我有两个数据帧

代码语言:javascript
复制
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的相应值。

结果应该如下所示

代码语言:javascript
复制
df3 <- data.frame(Region = c(1:5),Results=c(25,21,34,45,45))
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-03 20:40:28

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

代码语言:javascript
复制
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创建的,则可以进一步简化上述解决方案。

代码语言:javascript
复制
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

更新

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

代码语言:javascript
复制
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

注:未使用外部包

票数 1
EN

Stack Overflow用户

发布于 2020-02-03 20:48:01

涉及dplyrtidyr的一种选择可以是:

代码语言:javascript
复制
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中的两列,它们的名称与打字机的名称相同。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60046799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档