如果值为X,如何检查X是否小于0.05,并在R的data.frame中的另一个单元格中写入“ YES”或“ NO”?

时间:2019-01-21 18:04:10

标签: r

我有以下类型的文件(变量“ 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中修复此问题吗?

2 个答案:

答案 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)

enter image description here