输入所有成对组合的嵌套 for 循环的矢量化
Vectorization of a nested for-loop that inputs all paired combinations
我认为必须回答以下问题或者必须存在一个函数才能做到这一点,但我找不到答案。
我有一个嵌套循环,它从一个 3 列中取出一行。数据框并将其复制到其他每一行旁边,以形成一个 6 列。数据框(具有所有可能的组合)。这工作正常,但对于中等大小的数据集(800 行),循环需要很长时间才能完成任务。
我将在示例数据集上进行演示:
Sdat <- data.frame(
x = c(10,20,30,40),
y = c(15,25,35,45),
ID =c(1,2,3,4)
)
compar <- data.frame(matrix(nrow=0, ncol=6)) # to contain all combinations
names(compar) <- c("x","y", "ID", "x","y", "ID")
N <- nrow(Sdat) # how many different points we have
for (i in 1:N)
{
for (j in 1:N)
{
Temp1 <- Sdat[i,] # data from 1st point
Temp2 <- Sdat[j,] # data from 2nd point
C <- cbind(Temp1, Temp2)
compar <- rbind(C,compar)
}
}
这些循环准确地提供了我需要进行进一步分析的输出。关于矢量化此部分的任何建议?
你可以这样做:
ind <- seq_len(nrow(Sdat))
grid <- expand.grid(ind, ind)
compar <- cbind(Sdat[grid[, 1], ], Sdat[grid[, 2], ])
使用 rep 的简单解决方案(假设您对数据帧输出感到满意):
compar <- data.frame(x = rep(Sdat$x, each = N),
y = rep(Sdat$y, each = N),
id = rep(1:n, each = N),
x1 = rep(Sdat$x, N),
y1 = rep(Sdat$y, N),
id_1 = rep(1:n, N))
我认为必须回答以下问题或者必须存在一个函数才能做到这一点,但我找不到答案。 我有一个嵌套循环,它从一个 3 列中取出一行。数据框并将其复制到其他每一行旁边,以形成一个 6 列。数据框(具有所有可能的组合)。这工作正常,但对于中等大小的数据集(800 行),循环需要很长时间才能完成任务。 我将在示例数据集上进行演示:
Sdat <- data.frame(
x = c(10,20,30,40),
y = c(15,25,35,45),
ID =c(1,2,3,4)
)
compar <- data.frame(matrix(nrow=0, ncol=6)) # to contain all combinations
names(compar) <- c("x","y", "ID", "x","y", "ID")
N <- nrow(Sdat) # how many different points we have
for (i in 1:N)
{
for (j in 1:N)
{
Temp1 <- Sdat[i,] # data from 1st point
Temp2 <- Sdat[j,] # data from 2nd point
C <- cbind(Temp1, Temp2)
compar <- rbind(C,compar)
}
}
这些循环准确地提供了我需要进行进一步分析的输出。关于矢量化此部分的任何建议?
你可以这样做:
ind <- seq_len(nrow(Sdat))
grid <- expand.grid(ind, ind)
compar <- cbind(Sdat[grid[, 1], ], Sdat[grid[, 2], ])
使用 rep 的简单解决方案(假设您对数据帧输出感到满意):
compar <- data.frame(x = rep(Sdat$x, each = N),
y = rep(Sdat$y, each = N),
id = rep(1:n, each = N),
x1 = rep(Sdat$x, N),
y1 = rep(Sdat$y, N),
id_1 = rep(1:n, N))