循环选择成对序列

1 iteration r

我有一个data.frame带有40系列的R,我想选择成对系列来应用一个功能,(即系列1和系列21,系列2和系列22).但是我收到以下代码的错误:

for(i in 1:ncol(Date)) {
    pairwise <-Date[, c(i,i+20)]
}
Run Code Online (Sandbox Code Playgroud)

我想pairwise在其他功能中使用.

有人可以帮帮我吗?

预先感谢

Rei*_*son 6

这是因为您在i> 20 时请求高于40的列.请参阅此示例:

set.seed(1)
DF <- data.frame(matrix(rnorm(40*100), ncol = 40))

## simple function to apply/use
foo <- function(x1, x2) return(x1 - x2)

## something to hold results
res <- matrix(ncol = ncol(DF), nrow = nrow(DF))

## loop - oops error
for(i in seq_len(ncol(DF))) {
    res[,i] <- foo(DF[,i], DF[,i+20])
}
Run Code Online (Sandbox Code Playgroud)

你收到这个错误:

Error in `[.data.frame`(DF, , i + 20) : undefined columns selected
Run Code Online (Sandbox Code Playgroud)

这是因为i取值1,...,40.一旦i> = 21,(i + 20)> 40,你只有40列数据.一个简单的修改是仅循环前20列:

## something to hold results
res <- matrix(ncol = ncol(DF) / 2, nrow = nrow(DF))
for(i in seq_len(ncol(DF)/2)) {
    res[,i] <- foo(DF[,i], DF[,i+20])
}
Run Code Online (Sandbox Code Playgroud)

如果你想要的只是col 1和col 21,col 2和col 22等.如果你想要所有成对比较,那么你需要尝试不同的东西,因为单个循环不起作用.

(在有人把我拉得非常低效地使用一个循环之前,那个例子就是这个,一个没有想象力的例子应用于该函数foo().在这种情况下,DF[, 1:20] - DF[, 21:40]将得到与中相同的结果res.)