通过R中的循环命名列表项

时间:2014-07-09 17:01:46

标签: r list for-loop

我想获取一个列表,创建一个列表项名称的String向量,用通用名称填充空白,然后将名称向量设置为列表的名称。

我的代码适用于没有包含名称的项目的列表。但是,如果有名称的项目,则无效。

addNamesToList <- function(myList){
  listNames <- vector()
  for(i in 1:length(myList)){
    if(identical(names(myList[i]),NULL)){
      listNames <- c(listNames,paste("item",i,sep=""))
    }else{
      listNames <- c(listNames,names(myList[i]))
    }
  }
  names(myList) <- listNames
  return (myList)
}

没有命名项目的结果

$item1
[1] 2 3 4

$item2
[1] "hey" "ho" 

带有命名项目的结果

[[1]]
[1] 2 3 4

[[2]]
[1] "hey" "ho" 

$hello
[1] 2 3 4

希望你能提供帮助。

1 个答案:

答案 0 :(得分:4)

听起来你想在当前没有名字的地方插入名字。如果是这种情况,我建议通过names(x) <- value使用直接分配,而不是使用循环来填充空白。

在以下示例中,lst创建了三个元素的示例列表,其中第二个元素未命名。请注意,即使只有一个列表元素具有名称,其names向量也是与lst长度相同的字符向量。

( lst <- list(item1 = 1:5, 6:10, item3 = 11:15) )
# $item1
# [1] 1 2 3 4 5
#
# [[2]]
# [1]  6  7  8  9 10
#
# $item3
# [1] 11 12 13 14 15

names(lst)
# [1] "item1" ""      "item3"

我们可以使用以下内容在空名称元素中插入名称。如果右侧矢量与左侧矢量的长度相同,这也适用于矢量。

names(lst)[2] <- "item2"
lst
# $item1
# [1] 1 2 3 4 5
#
# $item2
# [1]  6  7  8  9 10
#
# $item3
# [1] 11 12 13 14 15

对于包含偶发空名称的较长列表,您可以使用

names(list)[!nzchar(names(list))] <- namesToAdd

nzchar基本上意味着&#34;非零字符&#34;如果元素是非零长度字符串,则返回逻辑TRUE。