我想得到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")
有人知道如何正确地编写这个循环吗?
rbl8hiat1#
编写此循环的一种方法是使用列表来定义a:
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
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
lapply(a, \(x) as.matrix(dist(iris[x, 2], method = "euclidian")))
mfuanj7w2#
正如你的问题标题中所说,你想通过“每50行"循环。您可以像下面这样使用ceiling尝试tapply
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循环。
ceiling(seq_len(nrow(iris)) / 50)
a <- list(1:50,51:100,101:150)
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"))) }
5ssjco0h3#
使用c(),所有的东西都变成了一个原子向量1,2...150,你的迭代是逐行而不是逐组进行的。使用list()时,它们不会连接。那你想怎么处理结果...打印或存储它们?以下代码将结果存储在列表中:
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") }
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" ...
4条答案
按热度按时间rbl8hiat1#
编写此循环的一种方法是使用列表来定义
a
:并将这些值分配给新列表(
newlist
)。如果你想按照你的问题做一个for
循环,那就是:你可以使用
lapply
来实现:mfuanj7w2#
正如你的问题标题中所说,你想通过“每50行"循环。
您可以像下面这样使用
ceiling
尝试tapply
其中
ceiling(seq_len(nrow(iris)) / 50)
将行按每50行划分为一组。或者,您应该在
a
的列表中指定行组,例如a <- list(1:50,51:100,101:150)
,然后执行for
循环。5ssjco0h3#
使用
c()
,所有的东西都变成了一个原子向量1,2...150
,你的迭代是逐行而不是逐组进行的。使用list()
时,它们不会连接。那你想怎么处理结果...打印或存储它们?以下代码将结果存储在列表中:5m1hhzi44#
也许
赠送