使用if循环使用来自三个不同数据帧的数据创建矩阵

问题描述 投票:0回答:2

我有三个数据框。一种是使用原始数据集的方法,另一种是表示我使用对原始样本进行采样的循环创建的空分布的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
2个回答
0
投票

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

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

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 

0
投票

假设这3个数据帧分别称为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')
© www.soinside.com 2019 - 2024. All rights reserved.