【问题标题】:How do you write a matrix using a "for" loop in R?如何使用 R 中的“for”循环编写矩阵?
【发布时间】:2017-09-29 02:08:12
【问题描述】:

因此,对于我目前正在进行的数据评估,我想使用“for”循环编写一个矩阵。

假设我有 0 到 100 之间的随机数:

E <- runif(100, 0, 100)

t <- 0 #start

for(t in 0:90) {
   D <- length(E[E >= t, E < (t + 10)])
   t = t + 10
}

所以我想做的是在每次迭代时将“D”写入矩阵,其中一列中包含“t”,另一列中包含“D”。

我听说您应该避免在 R 中使用循环,但我不知道有什么替代方法。

【问题讨论】:

    标签: r for-loop matrix


    【解决方案1】:

    您似乎想将变量分类 - 这正是 cut 所做的:

    E <- runif(100, 0, 100)
    table(cut(E, breaks = seq(0,100,10), right=FALSE))
    
    #>  [0,10)  [10,20)  [20,30)  [30,40)  [40,50)  [50,60)  [60,70)  [70,80)  [80,90) 
    #>      10       10        7       10        8       10       12       11       10 
    #>[90,100) 
    #>      12 
    

    如果您不想看到类别标签,请删除table 调用;如果您希望它采用“表格”格式,请将其包装在 as.matrix 中。

    请注意,如果您这样做是为了绘图,那么 histggplot 都会自动为您执行此操作:

    hist(E, breaks = seq(0,100,10))
    

    library("ggplot2")
    ggplot(data.frame(var=E), aes(x=var)) + geom_histogram(binwidth = 10)
    

    【讨论】:

      【解决方案2】:

      您可以使用sapply 而不是使用循环来执行此操作,它对序列中的每个项目进行操作并将结果存储在一个向量中,然后cbind 创建矩阵:

      E <- runif(100, 0, 100)
      t <- seq(0, 90, 10)
      
      D <- sapply(t, function(ti) {
        sum(E >= ti & E < (ti + 10))
      })
      
      cbind(t, D)
      #>        t  D
      #>  [1,]  0 11
      #>  [2,] 10 12
      #>  [3,] 20 14
      #>  [4,] 30 11
      #>  [5,] 40  9
      #>  [6,] 50 12
      #>  [7,] 60  7
      #>  [8,] 70  7
      #>  [9,] 80  6
      #> [10,] 90 11
      

      请注意,我还使用了sum(E &gt;= ti &amp; E &lt; (ti + 10)) 而不是length(length(E[E &gt;= ti &amp; E &lt; (ti + 10)])),作为一种略短的方法来查找E 中大于t 但小于t + 10 的项目数。

      【讨论】:

      • @Tarkus 不客气。请注意,对于这个特定的应用程序,您还可以选择cbind(t, table(findInterval(E, t))),因为findInterval 会根据分箱项目执行您要查找的操作,而table 会计算值。跨度>
      猜你喜欢
      • 1970-01-01
      • 2011-09-26
      • 1970-01-01
      • 2020-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-29
      相关资源
      最近更新 更多