如何在r中每50行循环一次?

x33g5p2x  于 2023-10-13  发布在  其他
关注(0)|答案(4)|浏览(105)

我想得到1:50、51:100、101:150行的结果。显然,使用循环比三次编写相同的代码更有效。
我的想法是:

a <- c(1:50,51:100,101:150)

for (i in a) {
as.matrix(dist(iris[i,2]), method = "euclidian")
}

但它不工作,我没有得到输出。但这确实有效:

as.matrix(dist(iris[1:50,2]), method = "euclidian")

有人知道如何正确地编写这个循环吗?

rbl8hiat

rbl8hiat1#

编写此循环的一种方法是使用列表来定义a

a <- list(1:50,51:100,101:150)

 # or more generally:
a <- split(seq(nrow(iris)), ceiling(seq(nrow(iris))/50))

并将这些值分配给新列表(newlist)。如果你想按照你的问题做一个for循环,那就是:

newlist <- vector(mode = "list", length = length(a))

for(x in seq_along(a)){
  newlist[[x]] <- as.matrix(dist(iris[a[[x]], 2], method = "euclidian"))
}

你可以使用lapply来实现:

lapply(a, \(x) as.matrix(dist(iris[x, 2], method = "euclidian")))
mfuanj7w

mfuanj7w2#

正如你的问题标题中所说,你想通过“每50行"循环。
您可以像下面这样使用ceiling尝试tapply

tapply(
    iris[, 2],
    ceiling(seq_len(nrow(iris)) / 50),
    \(x) as.matrix(dist(x), method = "euclidian")
)

其中ceiling(seq_len(nrow(iris)) / 50)将行按每50行划分为一组。
或者,您应该在a的列表中指定行组,例如a <- list(1:50,51:100,101:150),然后执行for循环。

a <- list(1:50, 51:100, 101:150)
res <- list()
for (i in a) {
    res <- append(res, list(as.matrix(dist(iris[i, 2]), method = "euclidian")))
}
5ssjco0h

5ssjco0h3#

使用c(),所有的东西都变成了一个原子向量1,2...150,你的迭代是逐行而不是逐组进行的。使用list()时,它们不会连接。那你想怎么处理结果...打印或存储它们?以下代码将结果存储在列表中:

a <- list(1:50,51:100,101:150)

result <- list()
for (row_group in a) {
  result[[paste(head(row_group, 1), "to", tail(row_group, 1))]] <- 
    as.matrix(dist(iris[i,2]), method = "euclidian")
}
5m1hhzi4

5m1hhzi44#

也许

n <- 3
m <- dim(iris)[1]/n
a <- lapply(m*(seq_len(n) - 1), `+`, 1:m)
r <- lapply(a, \(i) as.matrix(dist(iris[i, 2])))

赠送

str(r)
# List of 3
 # $ : num [1:50, 1:50] 0 0.5 0.3 0.4 0.1 0.4 0.1 0.1 0.6 0.4 ...
 #  ..- attr(*, "dimnames")=List of 2
 #  .. ..$ : chr [1:50] "1" "2" "3" "4" ...
 #  .. ..$ : chr [1:50] "1" "2" "3" "4" ...
 # $ : num [1:50, 1:50] 0 0 0.1 0.9 0.4 ...
 #  ..- attr(*, "dimnames")=List of 2
 #  .. ..$ : chr [1:50] "1" "2" "3" "4" ...
 #  .. ..$ : chr [1:50] "1" "2" "3" "4" ...
 # $ : num [1:50, 1:50] 0 0.6 0.3 0.4 0.3 ...
 #  ..- attr(*, "dimnames")=List of 2
 #  .. ..$ : chr [1:50] "1" "2" "3" "4" ...
 #  .. ..$ : chr [1:50] "1" "2" "3" "4" ...

相关问题