首页 > 解决方案 > R:生成一个列表,其中包含来自具有特定前缀的全局环境中的不同数量的元素

问题描述

我正在尝试生成一个列表,其中包含来自全局环境的带有前缀 ('nu_') 的元素(在本例中为整数,名为 'nu_1'、'nu_2'、...)。

但是,这些元素的数量可能会发生变化,因此我需要一种方法来根据它们的前缀动态获取所有相关元素并将它们组合成一个列表。


一些背景资料:

目标是让用户输入一些引用数据框中列名的字符串(公司名称)。我想要这个列表中所有这些列的总和。我使用以下 for 循环获得这些总和,并将它们分配给前缀为“nu_”的整数。

strings <- list("Amazon", "Google", "Facebook")

for (i in 1:length(strings)){
    assign(paste0("nu_",i), sum(data[ grep(paste0("company_",strings[i]),colnames(data)) ]) )
}

也许有更好的方法来实现我的整体目标。
对我的问题的任何帮助将不胜感激!

标签: rlist

解决方案


考虑使用apply family ( )构建总和列表l/s/vapply以维护一个对象,而不是根据用户输入的许多单独对象。如果使用字符向量而不是 list with sapply,则输出是一个命名列表。还考虑从向量中粘贴company_前缀:

# CHARACTER VECTOR OF THREE ITEMS
strings <- paste0("company_", c("Amazon", "Google", "Facebook"))
# EQUIVALENTLY:
strings <- paste0("company_", unlist(list("Amazon", "Google", "Facebook")))

sum_list <- sapply(strings, function(i) sum(data[,grep(i,colnames(data))]),
                   simplify=FALSE)

sum_list$company_Amazon
sum_list$company_Google
sum_list$company_Facebook

如果需要重命名nu前缀,请使用字符串setNames序列:

sum_list <- setNames(sum_list, paste0("nu", seq_along(strings)))

sum_list$nu1
sum_list$nu2
sum_list$nu3

推荐阅读