2017-02-12 38 views
0

我有几个名称相似的列表,如“dist124”,“dist131”等。我在一个数据框中绑定这些列表/数组时遇到了问题。我的代码是这样的:获取多个列表的最大长度

id <- c(124,131,137,198) 
# create the dataframe with nrow as an initial size only for test 
# and ncols as the max length of my lists 
df <- data.frame(matrix(NA, nrow = 4, ncol = 33)) 

row.names(df) <- id 
a = 1 
for(i in id){ 
    df[a,] <- do.call(rbind, lapply(paste("dist",i, sep=""), get)) 
    a <- a+1} 

然后我收到此错误信息:

错误[<-.data.frame*tmp*,一,值= C(82.4416264694195,505.003082621159,:更换了5个项目,需要33

我知道,那是因为我的名单有不同的长度,所以为了解决这个问题,我想改变我的所有列表的长度一次(因为它们是超过200个列表)。

但我无法找到一个解决方案,以获得这些列表的最大长度的循环。

我已经找到了解决方案,长度不等这里的清单:
adding NA to make all list elements equal length

所以我试图以使其适应我的情况下,像这样:

b <- 1 
for(i in id){ 
    assign() 
    n[b] <- length(paste("dist",i, sep="")) 
lapply(paste("dist",i, sep=""), `length<-`, n) 
b <- b+1} 

如果我运行长度(dist124)= length(dist198),例如,我可以使它们相等,但我正在寻找循环解决方案,因为我有很多列表来更新其长度。

+0

为什么你想要将不同的列表整合到一个'data.frame'中? –

+0

因为然后我需要做一些计算,并在独特的文件中导出它们。 lmo的解决方案对我来说效果很好。谢谢:) –

回答

3

要获得大量具有类似名称列表的最大长度,你可以到以下几点:

# put the lists into a list 
myLists <- mget(ls(pattern="dist\\d+")) 

这里,模式参数是一个正则表达式,任何对象名称为“DIST匹配“后面跟着数字。 mget将匹配的对象放入列表中。接着,

# get the maximum length from these lists 
maxLength <- max(lengths(myLists)) 

lengths功能,作为R 3.2.0引入,计算列表中的每个对象的长度,并且是更快地实现的sapply(myList, length)。 (!感谢)

+0

旁边的问题,有没有一种方法来'追加'列表你的方式'mget'(我的意思是'模式'? –

+0

lmo,这是我正在寻找,已经实施!非常感谢:D –

+1

@db我不完全确定你在找什么,这里有一个尝试:'l1 < - list(a = 1,b = 5); l2 < - list(e = 6,d = 5)'这给出了一个嵌套列表,然后用'unlist'(如'unlist(mget(ls(pattern =“l \\ d +”)),recursive = FALSE)将其扁平化,并且可以用'c'将列表附加在一起。 – lmo

0

落实@Imo提供的代码后,我能到我的名单列表转换成数据帧,所以完整的代码是这样的:

# Join all lists in one nested list # 
myLists <- mget(ls(pattern="dist\\d+")) 
# Get the max length of those lists # 
maxLength <- max(lengths(myLists)) 
# generating a dataframe from the nested list, making all lengths equal 
allDistancesDf <- as.data.frame(do.call(rbind, lapply(myLists, `length<-`, maxLength))) 

谢谢大家了帮助;)