我有一个向量,就像这样:
有一种以“apply”风格来完成的方法吗?谢谢。-k
c("1", "a","b")
我希望你能帮我创建这个列表
list("a"=1,"b"=1)
有一种以“apply”风格来完成的方法吗?谢谢。-k
c("1", "a","b")
我希望你能帮我创建这个列表
list("a"=1,"b"=1)
使用 as.list
和 setNames
:
x = c("1", "a","b")
as.list(setNames(rep(as.numeric(x[1]), length(x) - 1), x[-1]))
as.list(setNames(x,x))
。 - user5359531R> kn <- c("1", "a", "b")
R> nl <- vector(mode="list", length=length(kn)-1)
R> names(nl) <- kn[-1]
R> nl <- lapply(nl, function(x) kn[1])
R> nl
$a
[1] "1"
$b
[1] "1"
R>
感谢Gavin发现之前的错误。
kn
没有任何名称,lapply
步骤也不会覆盖nl
,因此在此之前设置名称并不会使它们保留下来。 - Gavin Simpsonas.numeric(kn[1])
- 这与@Joshua Ulrich指出的我的答案存在相同的问题。 - Gavin Simpsonas.numeric()
,你的解决方案在 @knguyen 提出的问题上仍然比我的快得多。 - Gavin SimpsonmakeList <- function(vec) {
len <- length(vec[-1])
out <- as.list(rep(as.numeric(vec[1]), len))
names(out) <- as.character(vec[-1])
out
}
> vec <- c("1", "a","b")
> makeList(vec)
$a
[1] 1
$b
[1] 1
as.numeric
函数。 - Joshua Ulrichas.list(sapply(x[-1],function(y) as.double(x[1])))
library(microbenchmark)
microbenchmark(times=20,
Charles=as.list(setNames(rep(as.numeric(x[1]), length(x) - 1), x[-1])),
Gavin=makeList(x),
Anon=sapply(x[-1],function(y) as.double(x[1]),simplify=FALSE)
)
Unit: microseconds
expr min lq median uq max neval
Charles 10.868 11.7735 11.774 12.3775 55.848 20
Gavin 12.075 12.6795 13.132 13.8870 26.867 20
Anon 6.643 7.0950 7.548 8.1520 17.811 20
sapply(..., simplify=FALSE)
代替as.list(sapply(...))
。 - Matthew Lundberg