for循环中的子集数据-R

时间:2018-10-22 15:39:02

标签: r for-loop iteration subset

如何在for循环中执行以下操作?

x <- runif(30, 0, 1)
sub_1 <- x[1:10]
sub_2 <- x[11:20]
sub_3 <- x[21:30]

也就是说,我要创建三个不同的对象,每个对象都带有初始向量的一个子集,而无需编写多行代码。

这当然是我创建的一个简单案例,它使事情变得更容易。在我的实际情况下,我有一个大数据集,我想以类似的方式进行子集并分配名称。我要求一个for循环,因为我很难理解for循环背后的逻辑,而且我很少成功地使它们起作用。因此,欢迎提供其他解释。

3 个答案:

答案 0 :(得分:2)

如果您真的想使用for循环,则可以执行以下操作:

for (i in 1:3) {
  start <- 1 + (10 * (i - 1))
  end <- 10 * i
  assign(paste0("sub_", i), x[start:end])
}      

但是split的效率要高得多:

sub <- split(x, rep(1:3, each = 10))

除了split返回一个列表之外,输出是相同的。

identical(sub[[1]], sub_1)
# [1] TRUE
identical(sub[[2]], sub_2)
# [1] TRUE
identical(sub[[3]], sub_3)
# [1] TRUE

答案 1 :(得分:1)

考虑构建一个 sub 项目列表,而不要在全局环境中泛滥类似的变量。具体来说,每10个项目使用$("button", text: contains('Accept'))lapply。然后相应地重命名项目:

seq

或者,使用seq_10 <- lapply(seq(1, length(x), 10), function(i) x[i:(i+9)]) names(seq_10) <- paste0("sub_", 1:length(seq_10)) seq_10$sub_1 # [1] 0.6091323 0.5677653 0.7335186 0.8586379 0.7416119 0.4835484 0.2038851 0.3027926 0.3422036 0.8959509 seq_10$sub_2 # [1] 0.001431539 0.679949988 0.764357517 0.988070806 0.381550391 0.251816226 0.221106522 0.111756309 0.038826363 0.625358723 seq_10$sub_3 # [1] 0.7057926 0.1263321 0.5020490 0.8753861 0.9165018 0.2342572 0.1488096 0.1639103 0.9840052 0.6850799 建立分组因子,如@Harlan在此SO answer中所示,产生与上述解决方案完全相同的结果:

split

答案 2 :(得分:1)

要做到这一点,您可以执行以下操作:

for (i in 1:3) {
  assign(paste0("sub_", i), x[(10*i - 9):(10*i)])
}

但这实际上取决于您的应用程序,哪种方法是最佳的。