获取多个列表的最大长度
Get the max length of several lists
我有几个名字相似的列表,比如"dist124"、"dist131"等等。我在将 lists/arrays 绑定到一个数据框中时遇到问题。我的代码是这样的:
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}
然后我收到此错误消息:
Error in [<-.data.frame
(*tmp*
, a, , value = c(82.4416264694195, 505.003082621159, : replacement has 5 items, need 33
我知道这是因为我的列表长度不同,所以为了解决这个问题,我想一次更改所有列表的长度(因为它们超过 200 个列表)。
但我找不到将这些列表的最大长度放入循环的解决方案。
我在这里找到了不等长列表的解决方案:
所以我试着让它适应我的情况,像这样:
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),我可以使它们相等,但我正在寻找一个循环解决方案,因为我有很多列表来更新它的长度。
要获取大量具有相似名称的列表的最大长度,您可以执行以下操作:
# 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)
.
的更快实现
在实现@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)))
谢谢大家的帮助;)
我有几个名字相似的列表,比如"dist124"、"dist131"等等。我在将 lists/arrays 绑定到一个数据框中时遇到问题。我的代码是这样的:
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}
然后我收到此错误消息:
Error in
[<-.data.frame
(*tmp*
, a, , value = c(82.4416264694195, 505.003082621159, : replacement has 5 items, need 33
我知道这是因为我的列表长度不同,所以为了解决这个问题,我想一次更改所有列表的长度(因为它们超过 200 个列表)。
但我找不到将这些列表的最大长度放入循环的解决方案。
我在这里找到了不等长列表的解决方案:
所以我试着让它适应我的情况,像这样:
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),我可以使它们相等,但我正在寻找一个循环解决方案,因为我有很多列表来更新它的长度。
要获取大量具有相似名称的列表的最大长度,您可以执行以下操作:
# 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)
.
在实现@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)))
谢谢大家的帮助;)