2013-05-20 24 views
1

结合前面的列表的元素创建一个新的列表我有一个列表是这样的:由R中

v = list(a1= 1, a2 = 2, b1 = 3, b2= 4, b3 = 5) 

我的愿望的结果是创建一个列表是这样的:

v = list(a = c(1, 2), b = c(3, 4, 5)) 

但应该提到的是,矢量v是我的exapmle,我可以写上面的例子的代码,但我的问题是,如果每个时间长度aibi是不同的,如何写一个函数来获得我的愿望结果在R?

回答

2
split(unlist(v), sub("\\d+$", "", names(v))) 
# $a 
# a1 a2 
# 1 2 
# 
# $b 
# b1 b2 b3 
# 3 4 5 
+0

我不需要名字A1,A2,B1,B2,B3。我如何从结果中删除这些名称?我只需要$ a和$ b。 – rose

+0

我发现如何删除这些名称:split(unlist(v,use.names = FALSE),sub(“\\ d + $”,“”,names(v)))。谢谢。 – rose

2

我敢肯定有一个更聪明的方式,但这里有一个方法用正则表达式:

starters <- letters[1:2] 
v2 <- lapply(starters, function(x) { 
    unname(unlist(v[grepl(x, names(v))])) 
}) 

names(v2) <- starters 

## $a 
## [1] 1 2 
## 
## $b 
## [1] 3 4 5