【发布时间】:2011-11-11 17:57:32
【问题描述】:
给定一个长度为<= N 的列表,用尾随NULLs 填充它的最佳/最有效方法是什么(使其长度为N)。
这在任何体面的语言中都是单行的,但我不知道如何在 R 中的几行中(有效地)做到这一点,以便它适用于每个角落情况(零长度列表等等)。
【问题讨论】:
给定一个长度为<= N 的列表,用尾随NULLs 填充它的最佳/最有效方法是什么(使其长度为N)。
这在任何体面的语言中都是单行的,但我不知道如何在 R 中的几行中(有效地)做到这一点,以便它适用于每个角落情况(零长度列表等等)。
【问题讨论】:
让我们保持简单:
tst<-1:10 #whatever, to get a vector of length 10
tst<-tst[1:15]
【讨论】:
length(tst)=15。有更快的吗?你是怎么测试的?
tst<-list(1,2,3)。但当然,列表只是向量的一个特例,所以我想我会提供更通用的解决方案。
试试这个:
> l = list("a",1:3)
> N = 5
> l[N+1]=NULL
> l
[[1]]
[1] "a"
[[2]]
[1] 1 2 3
[[3]]
NULL
[[4]]
NULL
[[5]]
NULL
>
【讨论】:
这个怎么样?
> l = list("a",1:3)
> length(l)=5
> l
[[1]]
[1] "a"
[[2]]
[1] 1 2 3
[[3]]
NULL
[[4]]
NULL
[[5]]
NULL
【讨论】:
据我所知,直接编辑列表的长度似乎是最快的:
tmp <- vector("list",5000)
sol1 <- function(x){
x <- x[1:10000]
}
sol2 <- function(x){
x[10001] <- NULL
}
sol3 <- function(x){
length(x) <- 10000
}
library(rbenchmark)
benchmark(sol1(tmp),sol2(tmp),sol3(tmp),replications = 5000)
test replications elapsed relative user.self sys.self user.child sys.child
1 sol1(tmp) 5000 2.045 1.394952 1.327 0.727 0 0
2 sol2(tmp) 5000 2.849 1.943383 1.804 1.075 0 0
3 sol3(tmp) 5000 1.466 1.000000 0.937 0.548 0 0
但我想,除非你在很长的列表中经常这样做,否则差异并不大。
【讨论】:
我确信有更短的方法,但我倾向于这样做:
l <- as.list(1:10)
N <- 15
l <- c(l, as.list(rep(NA, N - length(l) )))
【讨论】:
您好:我不确定您是否在谈论实际列表,但如果您是,以下将起作用。它之所以有效,是因为一旦您访问不存在的向量(即列表是)的元素,R 会将向量扩展至该长度。
length <- 10
temp <- list("a","b")
print(temp)
temp[length] <- NULL
print(temp)
【讨论】: