繁体   English   中英

从两个数据帧创建-1、0、1矩阵

[英]Create a -1, 0, 1 matrix from two data frames

我想为表达式数据创建一个值分别为-1、0和1的矩阵。 我遇到的问题是数据位于两个单独的数据帧中,一个包含过度表达,另一个包含表达不足。 我想将它们合并到同一列中,并使用过度表达的术语显示“ 1”,将不足表达的术语显示为“ -1”,而将“ 0”保留不变。

>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

尝试了几种不同的方法,但是一直碰壁,却无法以类似问题的形式找到任何特定的东西。

这只是几个基本任务:

# 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

或使用interaction速记来检查多个条件。 这具有处理符合两个条件并标有条件的案件的附加优势。 它还允许任意标记。

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

您可以直接在每个数据帧上直接使用比较并将它们视为数字。 这将仅产生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))

演示在这里:

右旋酯

我敢肯定有比这更优雅的方法,但是您可以将列绑定在一起,创建一个new填充有0的列,测试“ 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

我们也可以这样做,而无需转换为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)))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM