【问题标题】:Using an if loop to create matrix using data from three different dataframes使用 if 循环使用来自三个不同数据帧的数据创建矩阵
【发布时间】:2020-05-12 04:05:42
【问题描述】:

我有三个数据框。一个具有原始数据集的平均值,两个代表我使用对原始样本进行采样的循环创建的空分布的第 2.75 个百分位和第 97.5 个百分位。

我创建了一个 if 循环,我想为每个循环复制它以生成一个看起来与我的数据帧格式相同但仅包含“-”、“+”或“0”的矩阵。这些符号取决于第一个数据帧的平均值是否大于第三个数据帧的第 97.25 个百分位变量,第一个数据帧的平均值是否低于第二个数据帧的第 2.75 个百分位,以及来自第一个数据框位于这两个变量之间。关于如何执行此 if 循环来完成此操作的任何想法?

    if (mean > 97.25th percentile){
  print("-")
} else if(mean < 2.75th percentile ) {
  print("+")
} else {
  print("0")
}

【问题讨论】:

    标签: r loops if-statement quantile


    【解决方案1】:

    一种方法是在开始循环之前首先初始化一个空的data.frame

    然后您可以使用您提议的if else if else 结构。

    set.seed(3)
    df.mean <- data.frame(mean = runif(100,0,100))
    df.2.75 <- data.frame(centil275 = runif(100,1,4))
    df.97.5 <- data.frame(centil975 = runif(100,97,100))
    
    df.result <- data.frame()
    for(i in 1:nrow(df.mean)){
      if(df.mean[i,1] > df.97.5[i,1]) df.result[i,1] <- "-"
      else if(df.mean[i,1] < df.2.75[i,1]) df.result[i,1] <- "+"
      else df.result[i,1] <- "0"
    }
    
    df.final <- do.call(cbind,list(df.mean,df.2.75,df.97.5,df.result))
    df.final
    df.final
    #          mean centil275 centil975 V1
    #1   16.8041526  3.299013  99.19449  0
    #2   80.7516399  3.046397  99.58147  0
    #3   38.4942351  1.627392  98.02813  0
    #4   32.7734317  3.135831  98.47877  0
    #5   60.2100675  2.815895  99.56156  0
    #6   60.4394054  2.021678  98.16176  0
    #7   12.4633444  1.123511  99.17952  0
    #8   29.4600924  2.205258  99.05237  0
    #9   57.7609919  1.237179  99.53660  0
    #10  63.0979274  1.937658  97.09840  0
    #...
    
    table(df.final[,4])
    # -  +  0 
    # 1  3 96 
    

    【讨论】:

    • 这太棒了!但是我收到此错误:>“FR5_final_means[i, 1] > quantile_high[i, 1] 中的错误:不兼容方法(“Ops.data.frame”,“Ops.factor”):这些类型的比较不是实施
    • 我怀疑FR5_final_means[, 1]quantile_high[, 1] 不是数字类。你可以试试FR5_final_means[, 1] &lt;- as.numeric(as.character(FR5_final_means[, 1]))quantile_high[, 1] &lt;- as.numeric(as.character(quantile_high[, 1]))。否则,您可以通过编辑您的原始问题来提供str(quantile_high)str(FR5_final_means) 的输出。
    【解决方案2】:

    假设这3个dataframe分别被称为dfmdf97df2,你可以使用嵌套的ifelse

    result <- ifelse(dfm > df97, '-', ifelse(dfm < df2, '+', 0))
    

    或者使用dplyr::case_when

    result <- dplyr::case_when(df.mean > df.97.5 ~ '-', 
                               df.mean < df.2.75 ~ '+', TRUE~'0')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-10
      • 2023-03-19
      • 2021-08-30
      • 1970-01-01
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      相关资源
      最近更新 更多