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

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

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

  1. a <- c(1:50,51:100,101:150)
  2. for (i in a) {
  3. as.matrix(dist(iris[i,2]), method = "euclidian")
  4. }

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

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

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

rbl8hiat

rbl8hiat1#

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

  1. a <- list(1:50,51:100,101:150)
  2. # or more generally:
  3. a <- split(seq(nrow(iris)), ceiling(seq(nrow(iris))/50))

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

  1. newlist <- vector(mode = "list", length = length(a))
  2. for(x in seq_along(a)){
  3. newlist[[x]] <- as.matrix(dist(iris[a[[x]], 2], method = "euclidian"))
  4. }

你可以使用lapply来实现:

  1. lapply(a, \(x) as.matrix(dist(iris[x, 2], method = "euclidian")))
展开查看全部
mfuanj7w

mfuanj7w2#

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

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

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

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

5ssjco0h3#

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

  1. a <- list(1:50,51:100,101:150)
  2. result <- list()
  3. for (row_group in a) {
  4. result[[paste(head(row_group, 1), "to", tail(row_group, 1))]] <-
  5. as.matrix(dist(iris[i,2]), method = "euclidian")
  6. }
5m1hhzi4

5m1hhzi44#

也许

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

赠送

  1. str(r)
  2. # List of 3
  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 ...
  4. # ..- attr(*, "dimnames")=List of 2
  5. # .. ..$ : chr [1:50] "1" "2" "3" "4" ...
  6. # .. ..$ : chr [1:50] "1" "2" "3" "4" ...
  7. # $ : num [1:50, 1:50] 0 0 0.1 0.9 0.4 ...
  8. # ..- attr(*, "dimnames")=List of 2
  9. # .. ..$ : chr [1:50] "1" "2" "3" "4" ...
  10. # .. ..$ : chr [1:50] "1" "2" "3" "4" ...
  11. # $ : num [1:50, 1:50] 0 0.6 0.3 0.4 0.3 ...
  12. # ..- attr(*, "dimnames")=List of 2
  13. # .. ..$ : chr [1:50] "1" "2" "3" "4" ...
  14. # .. ..$ : chr [1:50] "1" "2" "3" "4" ...
展开查看全部

相关问题