R中的矢量化索引

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

我试图在一个大数据帧中建立索引。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 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列数据,其中只有一列是需要的。您为我们提供了计算距离的函数和代码,而您可以只提供一个距离矩阵(然后只需要一个数据列)。像my
x
矩阵和
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)]
<