【问题标题】:Get the max length of several lists获取多个列表的最大长度
【发布时间】:2017-06-30 19:09:34
【问题描述】:

我有几个名称相似的列表,例如“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}

然后我收到此错误消息:

[&lt;-.data.frame(*tmp*, a, , value = 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),例如,我可以使它们相等,但我正在寻找一个循环解决方案,因为我有很多列表来更新它的长度。

【问题讨论】:

  • 为什么要将不同的列表整合成一个data.frame
  • 因为我需要进行一些计算并将它们导出到一个唯一的文件中。 lmo 的解决方案对我来说效果很好。谢谢:)

标签: r list maxlength rbind


【解决方案1】:

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

# 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))

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

【讨论】:

  • 附带问题,有没有办法让append 列出你mget 的方式(我的意思是pattern
  • lmo,这就是我想要的,已经实现了!非常感谢:D
  • @d.b 我不完全确定您在寻找什么,这里有一个尝试:l1 &lt;- list(a=1, b=5); l2 &lt;- list(e=6, d=5) 这给出了一个嵌套列表,然后用unlist 将其展平,例如unlist(mget(ls(pattern="l\\d+")), recursive=FALSE)。此外,您可以将列表与c 一起附加。
【解决方案2】:

在实现@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)))

谢谢大家的帮助;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-15
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 2013-02-21
    • 2012-11-04
    • 1970-01-01
    相关资源
    最近更新 更多