2017-02-24 72 views
1

我想將一些數值轉換爲因子。轉換將取決於數字輸入的值。根據數值給出水平

例如,假設我們有一個名爲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)) 

對於expval價值,我想獲得在tmp正確sign,但我不知道如何做到這一點,而不使用的ifelse繼承。

希望的輸出:

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

回答

3

這可以用專門爲這種目的設計的,symnum一個相當模糊的基礎R函數來完成:

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

可以使用軋製從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