【问题标题】:R - iterate to create list from condition based on multiple lists/vectorsR - 迭代以基于多个列表/向量的条件创建列表
【发布时间】:2019-04-17 20:33:40
【问题描述】:

我是一名初学者,无法理解 R 中多个列表(或向量)的嵌套 for 循环的输入/输出。我确信这已在其他地方得到解答(如果是,请提供链接) ,但我在网上找不到一个好的答案,用简单的术语解释它对我(我相信其他初学者编码器/R 用户)会很有帮助。

具体来说,我想知道如何正确索引列表元素,以便根据两个列表之间的某种关系建立条件,然后将满足此条件的一个列表的元素添加到新列表中。

换句话说,我想遍历列表“a”中的每个元素,检查它是否 == 到列表“b”中的任何/所有元素,如果为真,则添加列表“ a' 元素添加到新列表 'c'。

这是我尝试过的一个简化示例:

a <- as.list(c(1,2,3,11,12))
b <- as.list(c(1,2,3,4,5,6,7,8,9,10))

c <- list()
index <- 1
for (i in 1:length(a)){
  for (j in 1:length(b)){
    if (a[[i]] == b[[j]]) next 
      c[[index]] <- a[[i]]
      index <- index + 1
    }}

结果是一个包含 47 个元素的列表。我正在尝试的结果如下:

c
[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] 3

我在循环中索引元素的方式有什么问题?

【问题讨论】:

    标签: r list loops


    【解决方案1】:

    简单地说,

    if (condition) next 
    

    表示如果条件为 TRUE,则不执行任何操作并继续下一个循环。

    if (condition) {action}
    

    表示如果条件为真则执行动作。

    改成

    a <- as.list(c(1,2,3,11,12))
    b <- as.list(c(1,2,3,4,5,6,7,8,9,10))
    
    c <- list()
    index <- 1
    for (i in 1:length(a)){
      for (j in 1:length(b)){
        if (a[[i]] == b[[j]]) {
          c[[index]] <- a[[i]]
          index <- index + 1
        }}}
    

    这样就可以了

    【讨论】:

      【解决方案2】:

      你可以用%in%代替双for循环

      a[a %in% b]
      #[[1]]
      #[1] 1
      #
      #[[2]]
      #[1] 2
      #
      #[[3]]
      #[1] 3
      

      【讨论】:

      • 好的,但是如果我想写一个比 == 元素更复杂的条件怎么办?希望有一个更通用的解决方案,可以替代其他条件函数。
      • @Dorothy 我只能根据您提供的示例数据和您显示的预期输出来回答。但是,双 for 循环通常不是最佳选择。
      • 如果不是双 for 循环,我应该如何根据两个列表的比较来编写条件?
      • 你的最终目标是什么?
      • 我使用这种类型的比较批次有很多原因,我主要使用 sp 包处理空间数据。因此,例如,我想查看空间点列表中的每个元素是否与空间多边形列表中的每个元素相交,如果为真,则将这些空间点添加到新列表中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多