我有以下类型的文件(变量“ a”):
P OK
0.009109607206037 NA
0.296054274328919 NA
0.359366011629242 NA
4.77143881428015E-05 NA
0.002556197639041 NA
1.68489333654225E-05 NA
0.413536654401798 NA
7.8906355718309E-06 NA
0.183951454595559 NA
0.018652061230313 NA
9.62042790189634E-15 NA
0.151533362472736 NA
0.037140932397797 NA
0.350401082523352 NA
0.673474391454102 NA
0.000329419618776 NA
这些是在data.frame中在R中生成的数据,我所做的是计算P值,但是在最终文件中,我有5000多行,因此,为了简化我的生活,标记作为最后一列,但我无法在此处弄清楚如何进行if / else条件。
所以,我试过了:
If a$P<0.05
a$OK <- "Significant"
Else
a$OK <- "Not-Significant
但这没用...有人可以帮我在R中修复此问题吗?
答案 0 :(得分:2)
使用ifelse
:
a$OK <- ifelse(a$P < 0.05, "Significant", "Non-Signficant")
ifelse
函数是矢量化的,这意味着以上内容将填充数据框中的整个OK
列。
答案 1 :(得分:0)
Tim Biegeleisen's answer是解决问题的规范方法,但众所周知ifelse
很慢。
这里有两个选择。他们创建索引并使用它从字符串向量中获取值。
第一个使用逻辑结果,然后加1,因为R是基于1的。
第二个使用findInterval
。
OK1 <- c("Significant", "Non-Signficant")[(a$P >= 0.05) + 1]
OK2 <- c("Significant", "Non-Signficant")[findInterval(a$P, c(0, 0.05, 1))]
OK3 <- ifelse(a$P < 0.05, "Significant", "Non-Signficant")
identical(OK1, OK2) # TRUE
identical(OK1, OK3) # TRUE
现在进行一些速度比较。
library(ggplot2)
library(microbenchmark)
mb <- microbenchmark(
loginx = c("Significant", "Non-Signficant")[(a$P >= 0.05) + 1],
findInt = c("Significant", "Non-Signficant")[findInterval(a$P, c(0, 0.05, 1))],
ifelse = ifelse(a$P < 0.05, "Significant", "Non-Signficant")
)
mb
#Unit: microseconds
# expr min lq mean median uq max neval
# loginx 14.450 15.8580 17.52272 16.7705 18.6525 63.106 100
# findInt 18.726 21.0170 23.00090 23.2135 24.3680 46.071 100
# ifelse 31.940 33.0065 33.70410 33.4330 33.9235 48.500 100
autoplot(mb)