2017-05-30 81 views
1

我想要爲表達式數據創建一個值爲-1,0和1的矩陣。我遇到的問題是數據在兩個單獨的數據框架中,一個包含過度表達,另一個包含過低表達。我想將它們合併到同一列中,其中過度表達的術語顯示爲「1」,表達式下爲「-1」,並且不改變「0」。從兩個數據幀中創建一個-1,0,1矩陣

>over 
0.09 
0.08 
0.02 
0.10 
0.07 
>under 
0.07 
0.03 
0.06 
0.01 
0.02 

所以我想一個矩陣,給出了一個1爲< 0.05 over-1爲< 0.05 under

>new 
0 
-1 
1 
-1 
-1 

嘗試了不同的東西,而是不斷撞擊牆壁和避風港我們無法找到任何具體問題的形式。

回答

4

這只是一對夫婦的基本分配:使用interaction檢查多個條件

# recreate your data 
over <- c(0.09,0.08,0.02,0.10,0.07) 
under <- c(0.07,0.03,0.06,0.01,0.02) 

out <- vector("numeric",5) 
out[over < 0.05] <- 1 
out[under < 0.05] <- -1 
out 
#[1] 0 -1 1 -1 -1 

或者簡寫。這對處理符合這兩個標準並將其標記爲這樣的案例具有額外的優勢。它也允許任意標籤。

c(0,1,-1,2)[interaction(over < 0.05, under < 0.05)] 
#[1] 0 -1 1 -1 -1 
0

我敢肯定,有一個比這更優雅的方式,但你可以綁定列在一起,創建一個充滿0的new列,測試「over」和「under」條件,然後將new列轉換爲矩陣,全部使用dplyr。當然,如果兩個條件都成立,那麼第二個測試會覆蓋第一個測試的結果。

library(dplyr) 
new <- over %>% 
    bind_cols(under) %>% 
    mutate(new = 0) %>% 
    mutate(new = ifelse(over < 0.05, 1, new)) %>% 
    mutate(new = ifelse(under < 0.05, -1, new)) %>% 
    select(new) %>% 
    as.matrix() 

new 
    new 
[1,] 0 
[2,] -1 
[3,] 1 
[4,] -1 
[5,] -1 
+0

也許'case_when':'data_frame(之上,之下,新= case_when(超過<0.05〜1,下<0.05〜-1,TRUE〜 0))' – alistaire

2

您可以直接在每個數據框本身上直接使用比較,並將它們視爲數字。這將導致只有0或1個值。

mat <- as.matrix(as.numeric(df1$over < 0.05) - 
     as.numeric(df2$under < 0.05)) 
> mat 
     [,1] 
[1,] 0 
[2,] -1 
[3,] 1 
[4,] -1 
[5,] -1 

數據:

df1 <- data.frame(over=c(0.09, 0.08, 0.02, 0.10, 0.07)) 
df2 <- data.frame(under=c(0.07, 0.03, 0.06, 0.01, 0.02)) 

演示在這裏:

Rextester

0

我們也可以做到這一點,無須轉換爲numeric

new <- (df1$over < 0.05) - (df2$under < 0.05) 
dim(new) <- dim(df1) 
new 
#  [,1] 
#[1,] 0 
#[2,] -1 
#[3,] 1 
#[4,] -1 
#[5,] -1 

或者另一種選擇是

matrix(Reduce(`-`, lapply(cbind(df1, df2), `<`, 0.05)))