给出数值下的等级

时间:2017-02-24 14:46:41

标签: r dataframe

我想将一些数值转换为因子。转换将取决于数字输入的值。

例如,假设我们有一个名为ex的数据框和一个名为tmp的转换框。如果p值低于某个限度,则返回相应的因子。

ex <- data.frame(pval = c(0.002, 0.3, 0.02, 0.00005, 0.09))
tmp <- data.frame(sign = c("***", "**", "*", "+", "ns"), lim = c(.001, .01, .05, .1, 1))

对于pval中的每个ex值,我想在sign中获得正确的tmp,但我不确定如何在不使用继承的情况下执行此操作ifelse

期望的输出:

data.frame(pval = c(0.002, 0.3, 0.02, 0.00005, 0.09),
                  res = c("**", "ns", "*", "***", "+"))

2 个答案:

答案 0 :(得分:3)

这可以通过专门为此目的而设计的相当模糊的基本R函数来完成,symnum

ex$cond <- symnum(ex$pval, symbols=c("***", "**", "*", "+", "ns"),
                  cutpoints=c(0, .001, .01, .05, .1, 1.1))

返回

ex
   pval cond
1 2e-03   **
2 3e-01   ns
3 2e-02    *
4 5e-05  ***
5 9e-02    +

此外,基本R函数cut在这里完全正常。

ex$cond <- cut(ex$pval, labels=c("***", "**", "*", "+", "ns"),
               breaks=c(0, .001, .01, .05, .1, 1.1))

ex
   pval cond
1 2e-03   **
2 3e-01   ns
3 2e-02    *
4 5e-05  ***
5 9e-02    +

答案 1 :(得分:1)

您可以使用data.table中的滚动加入:

setDT(ex, key="pval")
setDT(tmp, key="lim")

tmp[ex, roll=-Inf]
   sign     lim
1:  *** 0.00005
2:   ** 0.00200
3:    * 0.02000
4:    + 0.09000
5:   ns 0.30000