【问题标题】:How to obtain vector from iteration result of for loop in R?如何从R中for循环的迭代结果中获取向量?
【发布时间】:2021-03-17 14:59:08
【问题描述】:

我有这个数据框 (df),当“ID”列与给定向量 (idvector) 的值匹配时,我需要获取列“amountN”中的值的向量,所以我创建了一个我通过打印 df$amountN 的值来测试的 for 循环,以检查它们实际上是否完成了 df$ID 条件,并且确实如此。这是 for 循环:

df
      amountS amountN  ID
64693   0.440    0.55 028
64702   0.360    0.52 028
64708   0.220    0.33 028
64714   0.500    0.27 028
64720   0.280    0.51 028
64726   0.520    0.47 028
64732   0.410    0.25 028
64735   0.090    0.11 028
64741   0.220    0.17 028
64750   0.630    0.48 028
64756   0.430    0.35 028
64762   1.200    0.40 028
65150   4.425   14.95 029
65156   5.035   23.60 029
65163   5.810   26.20 029

idvector <- c("010","025","028")

for(i in seq_len(nrow(df))){
    for (j in seq_len(length(idvector))){
      if(df$ID[i] == idvector[j]){
        print(df$amountN[i])
      }
    }
  }

到目前为止,一切都很好。但是,我尝试了很多方法,通过更改最后一行中的函数 print() 将这些值转换为向量,但似乎没有任何效果:

for(i in seq_len(nrow(df))){
    for (j in seq_len(length(idvector))){
      if(df$ID[i] == idvector[j]){
        x <- c(df$amountN[i])
      }
      x
    }
  }

我还尝试获取 df$amounN 的子集,然后使用来自 dplyr 库的 subsetselect 将数据转换为向量,但也没有得到,而是得到 NULL:

for(i in seq_len(nrow(df))){
    for (j in seq_len(length(idvector))){
      if(df$ID[i] == idvector[j]){
        x <- subset(df$amountN[i,])
      }
      x
    }
  }

我查看了数据并注意到这些值如下所示:

[1] 0.55
[1] 0.52
[1] 0.33
[1] 0.27
[1] 0.51
[1] 0.47
[1] 0.25
[1] 0.11
[1] 0.17
[1] 0.48
[1] 0.35
[1] 0.4

它们应该是这样的:

 [1]  0.55  0.52  0.33  0.27  0.51  0.47  0.25  0.11  0.17  0.48 
[11]  0.35  0.40

我真的需要一个向量或一个子集,这样我就可以将汇总统计数据和其他数据应用于数据,但还没有弄清楚。

我使用的是 R 版本 4.0.3

【问题讨论】:

    标签: r dataframe loops iteration


    【解决方案1】:

    base R 中,我们可以使用subset 更轻松地做到这一点

    subset(df, ID %in% idvector, select = amountN)$amountN
    #[1] 0.55 0.52 0.33 0.27 0.51 0.47 0.25 0.11 0.17 0.48 0.35 0.40
    

    关于 OP 的代码,我们可以通过将“x”定义为NULL 向量来修复,然后在每个循环中连接“x”,并将其分配回“x”。另外,请确保“idvector”的类型相同,即假设它也是数字

    x <- c()
    for(i in seq_len(nrow(df))){
        for (j in seq_len(length(idvector))){
          if(df$ID[i] == idvector[j]){
            x <- c(x, df$amountN[i])
          }
          x
        }
      }
    

    -输出

    x
    #[1] 0.55 0.52 0.33 0.27 0.51 0.47 0.25 0.11 0.17 0.48 0.35 0.40
    

    注意:OP 代码中的问题是每次迭代都会更新“x”,同时删除先前的输出。它需要串联

    数据

    df <- structure(list(amountS = c(0.44, 0.36, 0.22, 0.5, 0.28, 0.52, 
    0.41, 0.09, 0.22, 0.63, 0.43, 1.2, 4.425, 5.035, 5.81), amountN = c(0.55, 
    0.52, 0.33, 0.27, 0.51, 0.47, 0.25, 0.11, 0.17, 0.48, 0.35, 0.4, 
    14.95, 23.6, 26.2), ID = c(28L, 28L, 28L, 28L, 28L, 28L, 28L, 
    28L, 28L, 28L, 28L, 28L, 29L, 29L, 29L)), class = "data.frame", 
    row.names = c("64693", 
    "64702", "64708", "64714", "64720", "64726", "64732", "64735", 
    "64741", "64750", "64756", "64762", "65150", "65156", "65163"
    ))
    
    idvector <- c(10, 25, 28)
    

    【讨论】:

    • 非常感谢!我实际上正在使用你的,但我是新来的!效果很好
    【解决方案2】:

    您可以直接使用%in% 而不是df 和索引来避免循环:

    #Code
    vec <- df$amountN[df$ID %in% idvector]
    

    输出:

     [1] 0.55 0.52 0.33 0.27 0.51 0.47 0.25 0.11 0.17 0.48 0.35 0.40
    

    【讨论】:

      猜你喜欢
      • 2016-02-16
      • 1970-01-01
      • 1970-01-01
      • 2020-05-09
      • 2021-12-20
      • 2020-07-24
      • 2014-12-07
      • 1970-01-01
      • 2021-09-12
      相关资源
      最近更新 更多