【问题标题】:r create matrix from repeat loop outputr 从重复循环输出创建矩阵
【发布时间】:2015-06-12 15:52:16
【问题描述】:

对于某个向量N 中的每个值n,我想为我的数据框T 中的每个变量计算超过n 的值的百分比。

考虑以下输入数据框:

T <- data.frame(A=c(0.1,0.2,0.3), B=c(0.3,0.3,0.9),C=c(1,0.5,0))
T
#     A   B   C
# 1 0.1 0.3 1.0
# 2 0.2 0.3 0.5
# 3 0.3 0.9 0.0

我希望输出是一个看起来像这样的矩阵:

        A      B        C
n=0.1  66.6  100     66.6
n=0.2  33.3  100     66.6

我当前的实现不起作用:

 n <- 0.8
 repeat {
       Tlogic <- T > n
       TU <- as.matrix(apply(Tlogic,2,sum))

        q = NULL
        for (i in seq(along=TU[,1]))
            {
              percent <- (TU[i]/nrow(T))*100
              q = c(q, percent)
            }
         n <- n - 0.05;
 print(n);
 if(log(n) < -6) break
 }

【问题讨论】:

    标签: r repeat


    【解决方案1】:

    基本上,您要求对于某个向量N 中的每个值n,计算T 的每一列中超过n 的值的百分比。

    您实际上可以在 R 中的一行中执行此操作,方法是从写出循环的解决方案转移到使用 R 中的 *apply 函数的解决方案:

    N <- c(0.1, 0.2)
    do.call(rbind, lapply(N, function(n) c(n=n, 100*colMeans(T > n))))
    #        n        A   B        C
    # [1,] 0.1 66.66667 100 66.66667
    # [2,] 0.2 33.33333 100 66.66667
    

    对于N 中的每个值n,调用lapply(N, function(n) c(n=n, 100*colMeans(T &gt; n))) 计算一个表示n 的向量以及T 的每一列中超过n 的值的百分比。然后do.call(rbind, ...) 将所有这些组合到一个最终的输出矩阵中。

    在您的情况下,您希望 N 形成一个从 0.8 到 log(n) &lt; -6 的递减序列(每步 0.05)。在这种情况下,您可以通过以下方式获得 N 向量:

    N <- seq(.8, 0, -.05)
    N <- N[log(N) >= -6]
    

    【讨论】:

      猜你喜欢
      • 2018-01-30
      • 1970-01-01
      • 2014-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-25
      相关资源
      最近更新 更多