在列表的一列中查找特定值

3

我想知道一个列表中哪些对象在它们的某一列中具有特定的值。

为了解释我的情况,请运行以下简单示例:

将mtcars拆分成列表

mt_list = split(mtcars, f = mtcars$cyl)

如果我们查看其中一个元素,我们会看到“gear”列

head(mt_list$`4`)
            
               mpg  cyl  disp hp drat    wt  qsec vs am gear carb
Datsun 710     22.8   4 108.0 93 3.85 2.320 18.61  1  1    4    1
Merc 240D      24.4   4 146.7 62 3.69 3.190 20.00  1  0    4    2
Merc 230       22.8   4 140.8 95 3.92 3.150 22.90  1  0    4    2
Fiat 128       32.4   4  78.7 66 4.08 2.200 19.47  1  1    4    1
Honda Civic    30.4   4  75.7 52 4.93 1.615 18.52  1  1    4    2
Toyota Corolla 33.9   4  71.1 65 4.22 1.835 19.90  1  1    4    1

我想知道在“gear”列中有数值为“4”的元素。因此,它将搜索列表的所有元素,查找“gear”列中的值,如果找到5的值,则列出元素。
期望的输出应该是=“4”“6”,其中可以在列gear中找到值“4”。(不在元素“8”中)
非常感谢任何帮助。
谢谢。
1个回答

5
我们可以遍历列表,并检查 'gear' 列中是否有等于 4 的元素,然后使用它来对列表的名称进行子集筛选。
names(mt_list)[sapply(mt_list, function(x) any(x$gear == 4))]
#[1] "4" "6"

或者使用%in%创建逻辑索引。
names(mt_list)[sapply(mt_list, function(x) 4 %in% x$gear)]
#[1] "4" "6"

运行得非常完美。最后一个问题,如果列名不是“Gear”,而是“Car1.Gear”、“Car2.Gear”、“Car3.Gear”等等,它们共享“.Gear”,该怎么办?谢谢。 - Rick
2
@Albert 在这种情况下,将 x$gear(匿名函数调用或lambda函数)更改为 x[[grep("^Car\\d+\\.Gear$", names(x))]] - akrun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接