循环施工的基础

在这个例子中,我们将计算数据帧中每列的平方偏差,在本例中为 mtcars

选项 A:整数索引

squared_deviance <- vector("list", length(mtcars))
for (i in seq_along(mtcars)){
  squared_deviance[[i]] <- (mtcars[[i]] - mean(mtcars[[i]]))^2
}

squared_deviance 是一个 11 元素列表,正如预期的那样。

class(squared_deviance)
length(squared_deviance)

选项 B:字符索引

squared_deviance <- vector("list", length(mtcars))
Squared_deviance <- setNames(squared_deviance, names(mtcars))
for (k in names(mtcars)){
  squared_deviance[[k]] <- (mtcars[[k]] - mean(mtcars[[k]]))^2
}

如果我们想要一个 data.frame 怎么办?好吧,有很多选项可以将列表转换为其他对象。但是,也许在这种情况下最简单的方法是将 for 结果存储在 data.frame 中。

squared_deviance <- mtcars #copy the original
squared_deviance[TRUE]<-NA  #replace with NA or do squared_deviance[,]<-NA
for (i in seq_along(mtcars)){
  squared_deviance[[i]] <- (mtcars[[i]] - mean(mtcars[[i]]))^2
}
dim(squared_deviance)
[1] 32 11

虽然我们使用字符选项(B),但结果将是相同的事件。