获取多个列表的最大长度

时间:2017-02-12 21:03:51

标签: r list maxlength rbind

我有几个名字相似的名单,例如" 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*,a ,,值= 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}

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

2 个答案:

答案 0 :(得分:3)

要获得具有相似名称的大量列表的最大长度,您可以执行以下操作:

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

这里,pattern参数是一个正则表达式,匹配名称为“dist”后跟数字的任何对象。 mget将匹配的对象放入列表中。接下来,

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

R 3.2.0中引入的lengths函数计算列表中每个对象的长度,并且是sapply(myList, length)的更快实现。

答案 1 :(得分: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)))

谢谢大家的帮助;)