从列表中的data.frame快速查找具有匹配元素名称的值

the*_*ist 2 r list elements match dataframe

我有一个包含xnumber命名元素的列表,每个元素都包含一系列数字.

我还有一个包含2列的data.frame:

  • column1:与列表元素匹配的名称(虽然不按顺序)
  • column2:数字向量

我希望快速确定列表元素中每行data.frame值的位置,因为list元素等于data.frame的name列中每个给定的data.frame行的值.

最终目标实际上是生成一个向量,其中包含我为data.frame的每一行匹配的值之前的每个适当元素的列表值.

我的数据有200,000行,所以我正在尝试优化这个过程.


我有一个列表和data.frame:

a = 1:5; b = 6:10; c = 4:8; l1 <- list(a,b,c) # a list
d1 <- data.frame(name = c('c','a','b'), val = c(7,3,8)) #a data.frame
Run Code Online (Sandbox Code Playgroud)

首先,我想知道列表中每个值的出现位置(这样元素与data.frame中同一行的名称匹配):

where <- ????

>where
[1] 4 3 3     # 7 = 4th number in c, 3 = 3rd # in a, and 8 = 3rd # in b
Run Code Online (Sandbox Code Playgroud)

但最终我希望输出显示我匹配前的元素中的值:

which <- ????

>which
[1] 6 2 7
Run Code Online (Sandbox Code Playgroud)

Hub*_*rtL 5

要拥有包含命名项的列表,可以使用以下语法:

l1 <- list(a=a,b=b,c=c)
Run Code Online (Sandbox Code Playgroud)

然后你可以 mapply()用来测试每​​个项目:

mapply(function(n,v) which(l1[[n]]==v) , d1$name,d1$val)
[1] 4 3 3
Run Code Online (Sandbox Code Playgroud)

然后mapply()再次获取值:

mapply(function(n,i) l1[[ n]][i] , d1$name,
    mapply(function(n,v) which(l1[[n]]==v)-1 , d1$name,d1$val))
[1] 6 2 7
Run Code Online (Sandbox Code Playgroud)