R中的矢量化索引
我试图在一个大数据帧中建立索引。sdata框架有300万个观测值和26个变量(底部)R中的矢量化索引,r,R,我试图在一个大数据帧中建立索引。sdata框架有300万个观测值和26个变量(底部) 你可以,但我怀疑你会节省很多时间,除非你找到一种完全矢量化的方法。换句话说,您必须避免使用apply或sapply之类的函数,它们都基于C中的for循环,因此如果有,也不会比普通for循环快太多 someFunction <- function(x) ifelse(x %in% seq(0, 50000, 100), 1, 0) # Here you have "vectorized" the inde
你可以,但我怀疑你会节省很多时间,除非你找到一种完全矢量化的方法。换句话说,您必须避免使用apply或sapply之类的函数,它们都基于C中的for循环,因此如果有,也不会比普通for循环快太多
someFunction <- function(x) ifelse(x %in% seq(0, 50000, 100), 1, 0)
# Here you have "vectorized" the indexing
system.time(sapply(1:nrow(diamonds), someFunction))
# 2.6 elapsed secs
## vs here where you're just using a for loop
system.time(
for(i in 1:nrow(diamonds)) {
k[i] <- someFunction(i)
}
)
# 2.7 elapsed secs
someFunction您可以,但我怀疑您是否能节省很多时间,除非您找到一种完全矢量化的方法。换句话说,您必须避免使用apply或sapply之类的函数,它们都基于C中的for循环,因此如果有,也不会比普通for循环快太多
someFunction <- function(x) ifelse(x %in% seq(0, 50000, 100), 1, 0)
# Here you have "vectorized" the indexing
system.time(sapply(1:nrow(diamonds), someFunction))
# 2.6 elapsed secs
## vs here where you're just using a for loop
system.time(
for(i in 1:nrow(diamonds)) {
k[i] <- someFunction(i)
}
)
# 2.7 elapsed secs
someFunction您可以,但我怀疑您是否能节省很多时间,除非您找到一种完全矢量化的方法。换句话说,您必须避免使用apply或sapply之类的函数,它们都基于C中的for循环,因此如果有,也不会比普通for循环快太多
someFunction <- function(x) ifelse(x %in% seq(0, 50000, 100), 1, 0)
# Here you have "vectorized" the indexing
system.time(sapply(1:nrow(diamonds), someFunction))
# 2.6 elapsed secs
## vs here where you're just using a for loop
system.time(
for(i in 1:nrow(diamonds)) {
k[i] <- someFunction(i)
}
)
# 2.7 elapsed secs
someFunction您可以,但我怀疑您是否能节省很多时间,除非您找到一种完全矢量化的方法。换句话说,您必须避免使用apply或sapply之类的函数,它们都基于C中的for循环,因此如果有,也不会比普通for循环快太多
someFunction <- function(x) ifelse(x %in% seq(0, 50000, 100), 1, 0)
# Here you have "vectorized" the indexing
system.time(sapply(1:nrow(diamonds), someFunction))
# 2.6 elapsed secs
## vs here where you're just using a for loop
system.time(
for(i in 1:nrow(diamonds)) {
k[i] <- someFunction(i)
}
)
# 2.7 elapsed secs
someFunction是的,我认为这是可行的。基本上,您希望从矩阵中得到一个向量,其中行索引是1:nrow(sdat)
,列索引是sdata$t\u targLoc
。这不是内置的(据我所知),但我们可以将矩阵转换为向量并获取正确的值
gazedist_vals = as.vector(gazedist)
rows = 1:nrow(sdat)
cols = sdat$t_targLoc
indices = (cols - 1) * nrow(gazedist) + rows
sdata$gdist_T = gazedist_vals[indices]
我想那会满足你的要求
您的数据摘录没有很好地说明这一点,因为t\u targLoc
始终为3。这里有一个小例子:
x = matrix(c(5,2,65,8,4,2), nrow = 2)
x
# [,1] [,2] [,3]
# [1,] 5 65 4
# [2,] 2 8 2
as.vector(x)
# [1] 5 2 65 8 4 2
rows = c(1, 1, 2)
cols = c(3,2,1)
inds = (cols - 1) * nrow(x) + rows
as.vector(x)[inds]
# [1] 4 65 2
一句话:你的问题很全面,但很少的例子往往更可取。你给了我们26列数据,其中只有一列是需要的。您为我们提供了计算距离的函数和代码,而您可以只提供一个距离矩阵(然后只需要一个数据列)。像我的x
矩阵和rows
和cols
向量这样的一个小例子可能就是说明这个问题的全部内容。是的,我认为这是可行的。基本上,您希望从矩阵中得到一个向量,其中行索引是1:nrow(sdat)
,列索引是sdata$t\u targLoc
。这不是内置的(据我所知),但我们可以将矩阵转换为向量并获取正确的值
gazedist_vals = as.vector(gazedist)
rows = 1:nrow(sdat)
cols = sdat$t_targLoc
indices = (cols - 1) * nrow(gazedist) + rows
sdata$gdist_T = gazedist_vals[indices]
我想那会满足你的要求
您的数据摘录没有很好地说明这一点,因为t\u targLoc
始终为3。这里有一个小例子:
x = matrix(c(5,2,65,8,4,2), nrow = 2)
x
# [,1] [,2] [,3]
# [1,] 5 65 4
# [2,] 2 8 2
as.vector(x)
# [1] 5 2 65 8 4 2
rows = c(1, 1, 2)
cols = c(3,2,1)
inds = (cols - 1) * nrow(x) + rows
as.vector(x)[inds]
# [1] 4 65 2
一句话:你的问题很全面,但很少的例子往往更可取。你给了我们26列数据,其中只有一列是需要的。您为我们提供了计算距离的函数和代码,而您可以只提供一个距离矩阵(然后只需要一个数据列)。像我的x
矩阵和rows
和cols
向量这样的一个小例子可能就是说明这个问题的全部内容。是的,我认为这是可行的。基本上,您希望从矩阵中得到一个向量,其中行索引是1:nrow(sdat)
,列索引是sdata$t\u targLoc
。这不是内置的(据我所知),但我们可以将矩阵转换为向量并获取正确的值
gazedist_vals = as.vector(gazedist)
rows = 1:nrow(sdat)
cols = sdat$t_targLoc
indices = (cols - 1) * nrow(gazedist) + rows
sdata$gdist_T = gazedist_vals[indices]
我想那会满足你的要求
您的数据摘录没有很好地说明这一点,因为t\u targLoc
始终为3。这里有一个小例子:
x = matrix(c(5,2,65,8,4,2), nrow = 2)
x
# [,1] [,2] [,3]
# [1,] 5 65 4
# [2,] 2 8 2
as.vector(x)
# [1] 5 2 65 8 4 2
rows = c(1, 1, 2)
cols = c(3,2,1)
inds = (cols - 1) * nrow(x) + rows
as.vector(x)[inds]
# [1] 4 65 2
一句话:你的问题很全面,但很少的例子往往更可取。你给了我们26列数据,其中只有一列是需要的。您为我们提供了计算距离的函数和代码,而您可以只提供一个距离矩阵(然后只需要一个数据列)。像我的x
矩阵和rows
和cols
向量这样的一个小例子可能就是说明这个问题的全部内容。是的,我认为这是可行的。基本上,您希望从矩阵中得到一个向量,其中行索引是1:nrow(sdat)
,列索引是sdata$t\u targLoc
。这不是内置的(据我所知),但我们可以将矩阵转换为向量并获取正确的值
gazedist_vals = as.vector(gazedist)
rows = 1:nrow(sdat)
cols = sdat$t_targLoc
indices = (cols - 1) * nrow(gazedist) + rows
sdata$gdist_T = gazedist_vals[indices]
我想那会满足你的要求
您的数据摘录没有很好地说明这一点,因为t\u targLoc
始终为3。这里有一个小例子:
x = matrix(c(5,2,65,8,4,2), nrow = 2)
x
# [,1] [,2] [,3]
# [1,] 5 65 4
# [2,] 2 8 2
as.vector(x)
# [1] 5 2 65 8 4 2
rows = c(1, 1, 2)
cols = c(3,2,1)
inds = (cols - 1) * nrow(x) + rows
as.vector(x)[inds]
# [1] 4 65 2
一句话:你的问题很全面,但很少的例子往往更可取。你给了我们26列数据,其中只有一列是需要的。您为我们提供了计算距离的函数和代码,而您可以只提供一个距离矩阵(然后只需要一个数据列)。像myx
矩阵和rows
和cols
向量这样的一个小例子可能就是显示问题所需的全部内容。似乎您想要抓住gazedist
的第i行和sdist$$t\u targLoc[i]
列。有一个内置的。使用:
sdata$gdist_T <- gazedist[cbind(1:nrow(gazedist),sdata$t_targLoc)]
第二个for
循环可以替换为,例如:
f <- function(x,y) {
x <- sdata$RIGHT_GAZE_X-x
y <- sdata$RIGHT_GAZE_Y-y
sqrt(x^2+y^2)
}
ggazedist <- mapply(f, loc$x, loc$y)
identical(gazedist,ggazedist)
# [1] TRUE
f您似乎想抓住gazedist的第i行和sdist$$t\u targLoc[i]
列。有一个内置的。使用:
sdata$gdist_T <- gazedist[cbind(1:nrow(gazedist),sdata$t_targLoc)]
第二个for
循环可以替换为,例如:
f <- function(x,y) {
x <- sdata$RIGHT_GAZE_X-x
y <- sdata$RIGHT_GAZE_Y-y
sqrt(x^2+y^2)
}
ggazedist <- mapply(f, loc$x, loc$y)
identical(gazedist,ggazedist)
# [1] TRUE
f您似乎想抓住gazedist的第i行和sdist$$t\u targLoc[i]
列。有一个内置的。使用:
sdata$gdist_T <- gazedist[cbind(1:nrow(gazedist),sdata$t_targLoc)]
第二个for
循环可以替换为,例如:
f <- function(x,y) {
x <- sdata$RIGHT_GAZE_X-x
y <- sdata$RIGHT_GAZE_Y-y
sqrt(x^2+y^2)
}
ggazedist <- mapply(f, loc$x, loc$y)
identical(gazedist,ggazedist)
# [1] TRUE
f您似乎想抓住gazedist的第i行和sdist$$t\u targLoc[i]
列。有一个内置的。使用:
sdata$gdist_T <- gazedist[cbind(1:nrow(gazedist),sdata$t_targLoc)]
<