我有三个数据框。一种是使用原始数据集的方法,另一种是表示我使用对原始样本进行采样的循环创建的空分布的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")
}
一种方法是在开始循环之前首先初始化一个空的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
假设这3个数据帧分别称为dfm
,df97
和df2
,则可以使用嵌套的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')