[英]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.