R:遍历列表列表以检索包含命中的子列表的 headers
R: loop over list of lists to retrieve headers of sublists that contain a hit
我在 R 中有一个列表列表。列表列表中的每个子列表都包含多个元素。这些子列表不一定都具有相同的长度。所有子列表都有特定的 header 名称。像这样:
#create list of lists
vector1 = c("apple","banana","cherry")
vector2 = c("banana","date","fig")
vector3 = c("fig","jackfruit","mango","plum")
listoflists = list(vector1 , vector2, vector3)
names(listoflists) = c("listA", "listB", "listC")
列表列表如下所示:
listoflists
$listA
[1] "apple" "banana" "cherry"
$listB
[1] "banana" "date" "fig"
$listC
[1] "fig" "jackfruit" "mango" "plum"
接下来,我有一个向量,其中包含也可以在子列表中找到的元素。像这样:
wanted = c("apple","banana","fig")
wanted
[1] "apple" "banana" "fig"
对于向量中的每个元素 wanted 我想提取包含此特定元素的列表列表中每个子列表的 header 名称。对于此处提供的示例,输出应如下所示:
#desired output
apple listA
banana listA listB
fig listB listC
我考虑将其放入 for 循环中以获得如下内容:
output_list = list()
for (i in wanted){
output = EXTRACT LIST HEADER WHEN i IS PRESENT IN SUBLIST
output_list[[i]] = output
}
但是,尚不清楚我是否可以,如果可以,如何遍历列表列表以仅提取 header 包含向量中元素的那些子列表的名称 想要。我研究了使用 unlist
函数,但这似乎对解决这个问题没有用。我查看了 Whosebug 以及其他论坛,但找不到任何概述类似问题的问题。因此,如果有人能指出正确的方向来解决这个问题,那将非常有帮助。
已经谢谢了!
有多种获取输出的方法。
1) 一个选项是遍历 'listoflists',根据 'wanted' 值对 vector
进行子集化,stack
它变成两列 data.frame
和 split
又变成 list
由 'values'
with(stack(lapply(listoflists, function(x)
x[x %in% wanted])), split(as.character(ind), values))
#$apple
#[1] "listA"
#$banana
#[1] "listA" "listB"
#$fig
#[1] "listB" "listC"
2) 或者我们可以先 stack
两列 'data.frame',然后 subset
行,然后 split
with(subset(stack(listoflists), values %in% wanted),
split(as.character(ind), values))
#$apple
#[1] "listA"
#$banana
#[1] "listA" "listB"
#$fig
#[1] "listB" "listC"
3)) 或者另一种选择是遍历 'wanted' 并根据匹配获得 'listoflists' 的 names
setNames(lapply(wanted, function(x)
names(which(sapply(listoflists, function(y) x %in% y)))), wanted)
#$apple
#[1] "listA"
#$banana
#[1] "listA" "listB"
#$fig
#[1] "listB" "listC"
这是另一个基础 R 选项
u <- unlist(listoflists)
sapply(wanted, function(x) rep(names(listoflists),lengths(listoflists))[u %in% x])
这给出了
$apple
[1] "listA"
$banana
[1] "listA" "listB"
$fig
[1] "listB" "listC"
您可以使用 stack
+ unstack
unstack(subset(stack(listoflists), values%in%wanted), ind~values)
$apple
[1] "listA"
$banana
[1] "listA" "listB"
$fig
[1] "listB" "listC"
我在 R 中有一个列表列表。列表列表中的每个子列表都包含多个元素。这些子列表不一定都具有相同的长度。所有子列表都有特定的 header 名称。像这样:
#create list of lists
vector1 = c("apple","banana","cherry")
vector2 = c("banana","date","fig")
vector3 = c("fig","jackfruit","mango","plum")
listoflists = list(vector1 , vector2, vector3)
names(listoflists) = c("listA", "listB", "listC")
列表列表如下所示:
listoflists
$listA
[1] "apple" "banana" "cherry"
$listB
[1] "banana" "date" "fig"
$listC
[1] "fig" "jackfruit" "mango" "plum"
接下来,我有一个向量,其中包含也可以在子列表中找到的元素。像这样:
wanted = c("apple","banana","fig")
wanted
[1] "apple" "banana" "fig"
对于向量中的每个元素 wanted 我想提取包含此特定元素的列表列表中每个子列表的 header 名称。对于此处提供的示例,输出应如下所示:
#desired output
apple listA
banana listA listB
fig listB listC
我考虑将其放入 for 循环中以获得如下内容:
output_list = list()
for (i in wanted){
output = EXTRACT LIST HEADER WHEN i IS PRESENT IN SUBLIST
output_list[[i]] = output
}
但是,尚不清楚我是否可以,如果可以,如何遍历列表列表以仅提取 header 包含向量中元素的那些子列表的名称 想要。我研究了使用 unlist
函数,但这似乎对解决这个问题没有用。我查看了 Whosebug 以及其他论坛,但找不到任何概述类似问题的问题。因此,如果有人能指出正确的方向来解决这个问题,那将非常有帮助。
已经谢谢了!
有多种获取输出的方法。
1) 一个选项是遍历 'listoflists',根据 'wanted' 值对 vector
进行子集化,stack
它变成两列 data.frame
和 split
又变成 list
由 'values'
with(stack(lapply(listoflists, function(x)
x[x %in% wanted])), split(as.character(ind), values))
#$apple
#[1] "listA"
#$banana
#[1] "listA" "listB"
#$fig
#[1] "listB" "listC"
2) 或者我们可以先 stack
两列 'data.frame',然后 subset
行,然后 split
with(subset(stack(listoflists), values %in% wanted),
split(as.character(ind), values))
#$apple
#[1] "listA"
#$banana
#[1] "listA" "listB"
#$fig
#[1] "listB" "listC"
3)) 或者另一种选择是遍历 'wanted' 并根据匹配获得 'listoflists' 的 names
setNames(lapply(wanted, function(x)
names(which(sapply(listoflists, function(y) x %in% y)))), wanted)
#$apple
#[1] "listA"
#$banana
#[1] "listA" "listB"
#$fig
#[1] "listB" "listC"
这是另一个基础 R 选项
u <- unlist(listoflists)
sapply(wanted, function(x) rep(names(listoflists),lengths(listoflists))[u %in% x])
这给出了
$apple
[1] "listA"
$banana
[1] "listA" "listB"
$fig
[1] "listB" "listC"
您可以使用 stack
+ unstack
unstack(subset(stack(listoflists), values%in%wanted), ind~values)
$apple
[1] "listA"
$banana
[1] "listA" "listB"
$fig
[1] "listB" "listC"