给定一个a包含不等长度向量的列表和一个b包含来自向量的元素的向量的列表a,我想得到一个等长的向量来b包含匹配a元素的索引b(这是我所知道的一个不好的解释)...
以下代码完成了这项工作:
a <- list(1:3, 4:5, 6:9)
b <- c(2, 3, 5, 8)
sapply(b, function(x, list) which(unlist(lapply(list, function(y, z) z %in% y, z=x))), list=a)
[1] 1 1 2 3
Run Code Online (Sandbox Code Playgroud)
sapply当然,用for循环替换也可以实现相同的目的
问题是这个代码将用于长度大于1000的列表和向量.在现实生活中,该函数大约需要15秒(for循环和for sapply).
有没有人知道如何加快速度,对并行方法安全?我没有看到矢量化方法(我不能用C编程,尽管这可能是最快的).
编辑:
只会强调Aaron使用match()的优雅解决方案,其速度提升1667次(从15到0.009)
我在它上面扩展了一下以允许多个匹配(返回是一个列表)
a <- list(1:3, 3:5, 3:7)
b <- c(3, 5)
g <- rep(seq_along(a), sapply(a, length))
sapply(b, function(x) g[which(unlist(a) %in% x)])
[[1]]
[1] 1 2 3
[[2]]
[1] 2 3
Run Code Online (Sandbox Code Playgroud)
这个的运行时间是0.169,这可能相当慢,但另一方面更灵活
我:=在将所有 data.frames 转换为 data.tables 后立即使用时收到警告:
library(data.table) #Win R-3.5.1 x64 data.table_1.12.2
df1 <- data.frame(A=1, B=2)
df2 <- data.frame(D=3)
lapply(mget(ls()), function(x) {
if (is.data.frame(x)) {
setDT(x)
}
})
df1[, rn:=.I]
Run Code Online (Sandbox Code Playgroud)
警告消息: In
[.data.table(df1, ,:=(rn, .I)) : Invalid .internal.selfref 通过获取 data.table 的(浅)副本检测和修复,以便 := 可以通过引用添加此新列。早些时候,这个 data.table 已被 R 复制(或使用 structure() 或类似方法手动创建)。避免 names<- 和 attr<- 目前在 R 中(而且很奇怪)可能会复制整个 data.table。使用 set* 语法来避免复制:?set、?setnames 和 ?setattr。如果此消息没有帮助,请将您的用例报告给 data.table 问题跟踪器,以便修复根本原因或改进此消息。
下面也生成相同的警告:
df3 <- data.frame(E=3)
df4 <- data.frame(FF=4)
for (l in list(df3, df4)) setDT(l)
df3[, rn:=.I] …Run Code Online (Sandbox Code Playgroud)