在 R 中,如何在带有名称的列表中进行操作

In R how to operate in a list with names

提问人:JohnBones JohnBones 提问时间:11/22/2022 最后编辑:ThomasIsCodingJohnBones JohnBones 更新时间:11/22/2022 访问量:50

问:

这是我的清单

list_names <- vector(mode = 'list')

list_names[['NAME A']] <- rnorm(n = 10,sd = 2)
list_names[['NAME B']] <- rnorm(n = 10,sd = 2)
list_names[['NAME C']] <- rnorm(n = 10,sd = 2)
list_names[['NAME D']] <- rnorm(n = 10,sd = 2)
list_names[['NAME E']] <- rnorm(n = 10,sd = 2)
list_names[['NAME F']] <- rnorm(n = 10,sd = 2)

是否可以选择列表的其他元素,执行如下操作:

list_names[[-"NAME A"]]

输出应该是一个列表,其中包含除元素之外的所有元素?"NAME A"

R 列表 索引 子集

评论


答:

2赞 akrun 11/22/2022 #1

我们需要而不是从列表中选择多个元素。另外,不起作用,而是使用[[[-setdiff

list_names[setdiff(names(list_names), "NAME A")]

-输出

$`NAME B`
 [1] -3.237378  4.082310  1.330150  1.784154  1.360302  5.530083 -4.593817 -2.021845 -2.278811  5.359281

$`NAME C`
 [1]  0.7641719 -0.9874008  0.9278225 -0.9709333 -0.1113175 -0.2290865 -0.2682319  2.8789682  0.6797194 -1.8765561

$`NAME D`
 [1]  3.8257606 -3.0235199 -3.4250881 -0.1333553  0.1202357  0.3694179 -2.0254176 -1.9489545  1.1015625  2.5311685

$`NAME E`
 [1]  2.4825388 -0.9485210 -2.7486256 -1.1970403 -1.3655852 -0.4481327 -2.0552594  0.3480588  1.9688285  1.1266358

$`NAME F`
 [1]  2.7535404  1.9831037 -2.3185156  0.5392882  1.0800234 -3.3278948 -1.7413377 -1.9040359  1.2478318  1.2664443

或者另一个选项是逻辑向量

list_names[names(list_names) != "NAME A"]
3赞 Dan Adams 11/22/2022 #2

您可以否定并提供要排除的名称向量,该向量将适用于任意数量的名称。这也允许在不返回错误的情况下不返回非成员的名称。%in%names(l)

l <- list(a = 1:3,
          b = 1:3,
          c = 1:3)

exclude_names <- "a"

l[!names(l) %in% exclude_names]
#> $b
#> [1] 1 2 3
#> 
#> $c
#> [1] 1 2 3

创建于 2022-11-21 with reprex v2.0.2

3赞 ThomasIsCoding 11/22/2022 #3

可能这就是你所追求的

list_names[-match('NAME A',names(list_names))]

!!警告:如果请求的名称不是 的有效名称,则解决方案将返回(感谢@akrun的评论)list_namesNULL

评论

1赞 ThomasIsCoding 11/22/2022
@akrun啊哈,是的,你是对的,如果我们没有提出这个名字,那就是一个问题。感谢您弄清楚:)
2赞 TarJae 11/22/2022 #4

另一种选择是使用 识别后,我们可以:purrrNAME Azap

purrr::list_modify(list_names,`NAME A`=purrr::zap())
$`NAME B`
 [1] -0.8390912  1.3642602  0.5660608 -0.9540717 -0.3867816 -0.2885152  2.2319706 -1.3307411 -1.6760324  1.2665064

$`NAME C`
 [1] -2.2107425  2.2710206  1.9398283  0.8652335  1.7688116  0.4958797 -0.6015274  1.3835770  3.7064383  0.8566645

$`NAME D`
 [1]  0.59945041 -2.35641913  0.58695111  0.42641701  1.16167489  0.05766859  1.37930744  0.18369875  0.62319538
[10] -0.36985800

$`NAME E`
 [1]  4.197209 -3.543006  2.558110  3.378172 -2.749093  1.549671 -1.237776  4.361019  1.611182 -1.038159

$`NAME F`
 [1] -0.3487643  1.0043091 -0.5399112  1.0901489  0.5731137 -1.2881900  1.0738251  1.8890504  1.0534804  0.4025011