【问题标题】:R: how to get names of list of lists in original order?R:如何按原始顺序获取列表列表的名称?
【发布时间】:2015-12-23 14:06:23
【问题描述】:

我想获取列表列表的名称。因此,我想将列表元素(第一级)的名称与列表元素列表(第二级)的名称粘贴(或添加)。这应该用“.”来完成。对我来说重要的是名称的顺序与列表列表中的顺序相同。这是一个没有值的示例(请注意,我有更多的子列表,每个元素有九个):

GER_WF_groups <- list(A=list(fruits.2000=matrix(),nuts.2000=matrix(),veggies.2000=matrix(),
            fruits.2001=matrix(),nuts.2001=matrix(),veggies.2001=matrix(),
            fruits.2002=matrix(),nuts.2002=matrix(),veggies.2002=matrix()), 
     B=list(fruits.2000=matrix(),nuts.2000=matrix(),veggies.2000=matrix(),
            fruits.2001=matrix(),nuts.2001=matrix(),veggies.2001=matrix(),
            fruits.2002=matrix(),nuts.2002=matrix(),veggies.2002=matrix()), 
     C=list(fruits.2000=matrix(),nuts.2000=matrix(),veggies.2000=matrix(),
            fruits.2001=matrix(),nuts.2001=matrix(),veggies.2001=matrix(),
            fruits.2002=matrix(),nuts.2002=matrix(),veggies.2002=matrix()))

直到知道我使用了一种复杂的方法来获取这个有序名称,但它确实有效,见下文:

years_sapply2 <- sapply(GER_WF_groups,function(x) paste("BLUE", names(x) ,sep="."))
str(years_sapply2)
years_mat2 <- matrix(years_sapply2, nrow=9, byrow=F)
years_mat3 <- matrix(years_mat2, ncol=1, byrow=F)
years_vec <- years_mat3[,1]
BLUEyears <- years_vec[1:9]
GREENyears <- BLUEyears
GREYyears <- BLUEyears
GREENyearsN <- sub("BLUE", "GREEN", GREENyears)
GREYyearsN <- sub("BLUE", "GREY", GREYyears)
years_namesALL <- c(BLUEyears, GREENyearsN, GREYyearsN)

我的问题是:有没有更快/更简单的方法来完成这项工作?谢谢

“years_namesALL”是预期结果。

【问题讨论】:

  • 您的列表嵌套有多深?

标签: r list


【解决方案1】:

Vongo 方法的一个变体如下所示:

names(unlist(setNames(GER_WF_groups, c("BLUE", "GREEN", "GREY"))))
##  [1] "BLUE.fruits.2000"   "BLUE.nuts.2000"     "BLUE.veggies.2000" 
##  [4] "BLUE.fruits.2001"   "BLUE.nuts.2001"     "BLUE.veggies.2001" 
##  [7] "BLUE.fruits.2002"   "BLUE.nuts.2002"     "BLUE.veggies.2002" 
## [10] "GREEN.fruits.2000"  "GREEN.nuts.2000"    "GREEN.veggies.2000"
## [13] "GREEN.fruits.2001"  "GREEN.nuts.2001"    "GREEN.veggies.2001"
## [16] "GREEN.fruits.2002"  "GREEN.nuts.2002"    "GREEN.veggies.2002"
## [19] "GREY.fruits.2000"   "GREY.nuts.2000"     "GREY.veggies.2000" 
## [22] "GREY.fruits.2001"   "GREY.nuts.2001"     "GREY.veggies.2001" 
## [25] "GREY.fruits.2002"   "GREY.nuts.2002"     "GREY.veggies.2002" 

如果你只有一层嵌套,可以试试:

names(unlist(setNames(GER_WF_groups, c("BLUE", "GREEN", "GREY")), recursive = FALSE))

【讨论】:

  • 确实,这样更好。
  • 正要发布相同的内容。我只需在 unlist 中添加 recursive=FALSE 来处理列表元素长度不为 1 的情况。
  • 在这个例子中工作正常。但是,在我的原始列表中,我有 250x250 的矩阵名称。我也得到了所有这些名字,所以我得到了例如“BLUE.fruits.2012.Germany”等等。有没有一种方法可以将矩阵 colnames 排除在外。 @Vongos 的答案是否同样的问题
  • @nicola,看来您的方法是必需的。
【解决方案2】:

也许试试这个:

gsub("C","GREY",gsub("A","BLUE",gsub("B","GREEN",names(unlist(GER_WF_groups)))))

编辑(无耻地抄袭@Ananda Mahto 对同一问题的编辑):

gsub("C","GREY",gsub("A","BLUE",gsub("B","GREEN",names(unlist(GER_WF_groups,recursive=F)))))

但是嵌套的gsub 显然不够优雅。

【讨论】:

  • 查看我对@Ananda Mahto 回答的评论
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-17
  • 1970-01-01
  • 2018-12-22
  • 1970-01-01
  • 1970-01-01
  • 2011-01-07
  • 2012-01-15
相关资源
最近更新 更多