【问题标题】:Subset data in a for loop - Rfor循环中的子集数据 - R
【发布时间】:2018-10-22 15:39:02
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你应该用你正在使用的语言标记这个问题,仅从这个问题来看并不完全明显。

标签: r for-loop iteration subset


【解决方案1】:

如果你真的想使用 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

【讨论】:

    【解决方案2】:

    要做到这一点,你可以这样做:

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

    但这真的取决于您的应用程序哪种方法是最佳的。

    【讨论】:

      【解决方案3】:

      考虑在您的全局环境中构建一个 项列表,而不是大量类似的变量。具体来说,每 10 个项目使用 lapplyseq。然后相应地重命名项目:

      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
      

      或者,使用split 构建一个分组因子,如@Harlan 在此SO answer 中所示,产生与上述解决方案完全相同的结果:

      split_10 <- split(x, ceiling(seq_along(x)/10))
      names(split_10) <- paste0("sub_", 1:length(split_10))
      
      all.equal(seq_10, split_10)
      # [1] TRUE
      
      identical(seq_10, split_10)
      # [1] TRUE
      

      【讨论】:

        猜你喜欢
        • 2021-06-23
        • 1970-01-01
        • 2020-12-07
        • 1970-01-01
        • 1970-01-01
        • 2020-11-04
        • 1970-01-01
        • 2017-12-30
        • 2021-06-21
        相关资源
        最近更新 更多