r - 根据 R 中的两个标准查找相应的值
问题描述
我有两个数据框
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))
解决方案
我们可以使用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
注意:不使用外部包
推荐阅读
- android - 如何通过启用活动A中的开关按钮来关闭活动B中的开关按钮?
- php - 按年份的 TIMESTAMP 的 php 组不起作用
- angular - 如何简单地对角度映射函数进行空检查?
- java - 如何从资源解析器工厂获取会话对象?
- ansible - 如何使用 Ansible 正确处理网络接口配置文件?
- excel - 检查对 Sharepoint 文件夹的访问权限/如果该文件夹存在
- c++ - 在编译阶段扩展“未定义行为”的原因是什么?
- python - 如何使用 tkinter 按钮将信息发送到定义
- highcharts - 使用 highcharts-ng 指令,Highcharts 向下钻取功能无法以角度方式工作
- asp.net-core - 与 DbQuery 的关系