在 R 中,如何根据 F 列中的匹配数据从 A 列到 E 列返回名称?

问题描述

我想根据 A 中列中的匹配数据返回 EF 列中的列名。然后我想将该值返回到一个新列 G 中。

例如:

df <- structure(list(A = c(-0.113802816901408,-0.613802816901408,0.136197183098592,0.126197183098592,0.286197183098592),B = c(-0.294595070422536,-0.504595070422535,0.125404929577464,0.135404929577464,0.275404929577465
),C = c(-0.277065727699531,-0.507065727699531,0.282934272300469,0.0729342723004693,0.122934272300469),D = c(-0.222699530516432,-0.132699530516432,-0.162699530516432,0.127300469483568,-0.0126995305164321
),E = c(-0.246845657276995,-0.426845657276995,-0.186845657276995,0.133154342723005,0.113154342723004),F = c(-0.222699530516432,0.275404929577465
)),row.names = c(NA,5L),class = "data.frame")

所以 G 列的向量最终应该是:DEAEB

理想情况下,如果有多个匹配项(我认为我的示例没有),最好将此类信息发送到新列或抛出错误。不过,第二个问题并不那么重要。

解决方法

将前 5 列与 F 列进行比较,并使用 max.col 获得具有相同值的列号。

df$G <- names(df)[max.col(df[1:5] == df$F)]
df

#           A          B           C           D          E          F G
#1 -0.1138028 -0.2945951 -0.27706573 -0.22269953 -0.2468457 -0.2226995 D
#2 -0.6138028 -0.5045951 -0.50706573 -0.13269953 -0.4268457 -0.4268457 E
#3  0.1361972  0.1254049  0.28293427 -0.16269953 -0.1868457  0.1361972 A
#4  0.1261972  0.1354049  0.07293427  0.12730047  0.1331543  0.1331543 E
#5  0.2861972  0.2754049  0.12293427 -0.01269953  0.1131543  0.2754049 B

在多个匹配的情况下,max.col 返回一个随机列号。您可以通过指定 ties.method 来处理它。有关详细信息,请参阅 ?max.col