R中Excel中索引匹配的等价物

Posted

技术标签:

【中文标题】R中Excel中索引匹配的等价物【英文标题】:Equivalent of Index matching from Excel in R 【发布时间】:2021-07-09 06:06:10 【问题描述】:

我有两张表,表 1 和 2

表格是这样给出的

 Table1 = read.table( textConnection("TimeString    P3  P5  P7  P9  P11
                      202101152300  19.52   51.32   56.37   60.26   71.37
                       202101160000 19.52   51.32   56.37   60.26   71.37
                       202101160100 19.52   51.32   56.37   60.26   71.37
                       202101160200 19.52   51.32   56.37   60.26   71.37
                       202101160300 19.52   51.32   56.37   60.26   71.37
                       202101160400 19.52   51.32   56.37   60.26   71.37
                       202101160500 19.76   51.68   56.77   60.67   71.79
                       202101160600 19.76   51.68   56.77   60.67   71.79
                       202101160700 19.54   51.12   56.16   60.01   71.01
                       202101160800 19.54   51.12   56.16   60.01   71.01
                       202101160900 25.45   51.12   56.16   60.01   71.01
                       202101161000 25.45   51.12   56.16   60.01   71.01
                       202101161100 25.45   51.12   56.16   60.01   71.01
                       202101161200 25.45   51.12   56.16   60.01   71.01
                       202101161300 25.45   51.12   56.16   60.01   71.01
                       202101161400 25.45   51.12   56.16   60.01   71.01
                       202101161500 25.45   51.12   56.16   60.01   71.01
                       202101161600 25.45   54.08   59.11   75.78   105.49
                       202101161700 25.45   54.08   59.11   75.78   105.49
                       202101161800 25.45   54.08   59.11   75.78   105.49
                       202101161900 25.45   51.12   56.16   60.01   71.01
                       202101162000 25.45   51.12   56.16   60.01   71.01
                       202101162100 25.45   51.12   56.16   60.01   71.01
                       202101162200 25.73   51.68   56.77   60.67   71.79
                       " ), header = T)

表 2 是一个非常大的表,但 sn-p 给出为

 Table2 = read.table(textConnection("PNumber    StartTimeString Modified
3   202101152300    TRUE
                                   5    202101152300    TRUE
                                   7    202101152300    TRUE
                                   9    202101152300    TRUE
                                   11   202101152300    TRUE
                                   3    202101160000    TRUE
                                   5    202101160000    TRUE
                                   7    202101160000    TRUE
                                   9    202101160000    TRUE
                                   11   202101160000    TRUE
                                   3    202101160100    TRUE
                                   5    202101160100    TRUE
                                   7    202101160100    TRUE
                                   9    202101160100    TRUE
                                   11   202101160100    TRUE
                                   3    202101160200    TRUE
                                   5    202101160200    TRUE
                                   7    202101160200    TRUE
                                   9    202101160200    TRUE
                                   11   202101160200    TRUE
                                   3    202101160300    TRUE
                                   5    202101160300    TRUE
                                   7    202101160300    TRUE
                                   9    202101160300    TRUE
                                   11   202101160300    TRUE
                                   3    202101160400    TRUE
                                   5    202101160400    TRUE
                                   7    202101160400    TRUE
                                   "),header = T)

现在我需要通过匹配将表 1 中的数字带入表 2:时间字符串(表 1 中的“TimeString”列和表 2 中的“StartTimeString”列)和表 1 的列名与字母“P”的连接" 并取值表 2 中的 "PNumber" 列

我使用公式在 Excel 中解决了它,并将表 2 转换为 Excel 表

=IF([@Modified],INDEX(Sheet1!$C$4:$G$27,MATCH([@StartTimeString],Sheet1!$B$4:$B$27,0),MATCH("P"&[@PNumber],Sheet1!$C$3:$G$3,0)),"")

结果是(这是我期待的结果)

 read.table(textConnection("PTrue
19.52
                                   51.32
                                   56.37
                                   60.26
                                   71.37
                                   19.52
                                   51.32
                                   56.37
                                   60.26
                                   71.37
                                   19.52
                                   51.32
                                   56.37
                                   60.26
                                   71.37
                                   19.52
                                   51.32
                                   56.37
                                   60.26
                                   71.37
                                   19.52
                                   51.32
                                   56.37
                                   60.26
                                   71.37
                                   19.52
                                   51.32
                                   56.37
                                   "),header = T)

在将 Excel 代码转换为 R 时,我首先粘贴 PNumber 和字母“P”的值,然后创建匹配列,最后将返回的值转换为数字,从而创建了新列

Table2$PNumberconcat = paste0("P",Table2$PNumber)
Table2$Match = ifelse(Table2$StartTimeString %in% Table1$TimeString,match(Table2$PNumberconcat,names(Table1)),"")
Table2$Match = as.numeric(Table2$Match)

在此之后,我尝试循环遍历它,但它似乎不起作用 - 我得到一个空列,我错过了什么?

for(i in nrow(Table2)) 
  for(j in nrow(Table1))
    Table2$PTrue[i] = ifelse(Table2$StartTimeString[i] %in% Table1$TimeString,Table1[j,Table2$Match[i]],"")
  

您可以使用与我不同的任何其他流程。提前致谢

【问题讨论】:

【参考方案1】:

您可以使用match 做到这一点:

rowindex <- match(Table2$StartTimeString, Table1$TimeString)
columnindex <- match(paste0("P",Table2$PNumber), names(Table1))
Table2$PTrue <- Table1[cbind(rowindex, columnindex)]

它返回:

Table2

#   PNumber StartTimeString Modified  PTrue
#1        3    202101152300     TRUE  19.52
#2        5    202101152300     TRUE  51.32
#3        7    202101152300     TRUE  56.37
#4        9    202101152300     TRUE  60.26
#5       11    202101152300     TRUE  71.37
#6        3    202101160000     TRUE  19.52
#7        5    202101160000     TRUE  51.32
#8        7    202101160000     TRUE  56.37
#9        9    202101160000     TRUE  60.26
#10      11    202101160000     TRUE  71.37
#11       3    202101160100     TRUE  19.52
#12       5    202101160100     TRUE  51.32
#13       7    202101160100     TRUE  56.37
#14       9    202101160100     TRUE  60.26
#15      11    202101160100     TRUE  71.37
#16       3    202101160200     TRUE  19.52
#17       5    202101160200     TRUE  51.32
#18       7    202101160200     TRUE  56.37
#19       9    202101160200     TRUE  60.26
#20      11    202101160200     TRUE  71.37
#21       3    202101160300     TRUE  19.52
#22       5    202101160300     TRUE  51.32
#23       7    202101160300     TRUE  56.37
#24       9    202101160300     TRUE  60.26
#25      11    202101160300     TRUE  71.37
#26       3    202101160400     TRUE  19.52
#27       5    202101160400     TRUE  51.32
#28       7    202101160400     TRUE  56.37

【讨论】:

以上是关于R中Excel中索引匹配的等价物的主要内容,如果未能解决你的问题,请参考以下文章

在 Excel 加载项中编辑数据(使用索引/匹配的 UDF)

Excel - SUMIF 索引和匹配

excel vba索引匹配数组以分隔文件

Excel 2010 索引匹配 VBA

在每个单元格 Excel 中使用 VBA 而不是使用公式(索引和匹配)

Pandas Merge 中未捕获 Excel 中的“索引匹配”功能(或者是吗?)