【问题标题】:How do I ignore double zeros before calculating correlation between two data frames in R在计算 R 中两个数据帧之间的相关性之前,如何忽略双零
【发布时间】:2021-09-09 06:48:09
【问题描述】:

我有两个具有相同列数(100:样本)和行数(9600:基因)的数据框。这两个数据帧是从两个不同的程序输出的,我想计算它们之间的相关性。

我的示例数据集:

df1 <-data.frame(Sample1 =c(0.52,2.5,8.3,10.5,5.3),Sample2=c(0,0,2,1,0), Sample3=c(0,12,13,14,0))
rownames(df1)<-c("KO1","KO2","KO3","KO4","KO5")
df2<- data.frame(Sample1=c(1,2,3,4,5),Sample2=c(0,0,8,9,0),Sample3=c(0,12,13,14,0))
rownames(df2)<-c("KO1","KO2","KO3","KO4","KO5")
df<-data.frame(df1,df2)

>df1
      Sample1 Sample2 Sample3
KO1    0.52       0       0
KO2    2.50       0      12
KO3    8.30       2      13
KO4   10.50       1      14
KO5    5.30       0       0

>df2
      Sample1 Sample2 Sample3
KO1       1       0       0
KO2       2       0      12
KO3       3       8      13
KO4       4       9      14
KO5       5       0       0

在计算相关性时,我想删除两个数据框中都为零的条目。例如,对于样本 1,应包括每一行,但对于样本 2,不应该包括 KO1、KO2 和 KO5,同样对于 sample3,不应包括 KO1 和 KO5。在这里,我计算两个数据帧之间的列相关性。
我尝试了以下代码:

output_without_zero<- with(subset(df, !(df1 == 0 & df2 == 0)), cor(df1,df2,method = "spearman"))
output_with_zero<- cor(df1,df2,method = "spearman")

我预计从相关性中删除零应该不同于包含它们。但是我得到了他们两个相同的相关矩阵。 如何获得欲望输出?

提前谢谢你

【问题讨论】:

  • cor(replace(df1, df1 == 0, NA), replace(df2, df2 == 0, NA), method = "spearman") 呢?

标签: r dataframe correlation


【解决方案1】:

将零替换为NA

df1[df1 == 0] <- NA
df2[df2 == 0] <- NA

complete.obs

cor(df1, df2, method = "spearman",  use = "complete.obs")
        Sample1 Sample2 Sample3
Sample1       1       1       1
Sample2      -1      -1      -1
Sample3       1       1       1

pairwise.complete.obs

cor(df1, df2, method = "spearman",  use = "pairwise.complete.obs")
        Sample1 Sample2 Sample3
Sample1     0.7       1       1
Sample2    -1.0      -1      -1
Sample3     1.0       1       1

【讨论】:

  • 感谢您的回答。但这不是我要找的。在计算相关性时,我想删除两个数据框中都为零的条目。例如,对于样本 1,每一行都应包括在内,但对于样本 2,不应包括 KO1、KO2 和 KO5,对于样本 3 也是如此,不应包含 KO1 和 KO5
【解决方案2】:

我认为您的意思是不应该包括 KO1、KO2 和 KO5。

另外,当没有df 时,我不确定subset(df, !(df1 == 0 &amp; df2 == 0) 是否有效。

试试-

inds <- rowSums(df1 == 0 & df2 == 0) == 0
#If you want to remove rows which has any occurrence of 0 in either dataframe
#inds <- rowSums(df1 == 0 | df2 == 0) == 0

df1_1 <- df1[inds, ]
df2_1 <- df2[inds, ]
output_with_zero<- cor(df1,df2,method = "spearman")
output_without_zero<- cor(df1_1,df2_1,method = "spearman")

【讨论】:

  • 感谢您的回复。但是,我不想完全删除 KO1、KO2 和 KO3。因为它对于其他样本具有非零值。
猜你喜欢
  • 1970-01-01
  • 2014-08-03
  • 1970-01-01
  • 1970-01-01
  • 2013-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多