【发布时间】:2018-06-07 17:08:19
【问题描述】:
我有两个数据帧,一个带有 corr 矩阵,一个带有相应的 p 值(即两者都是有序的,每个数据帧中的每个位置对应于同一个变量)。我想根据 2 个条件过滤 corr 数据框中的元素:
1) 将每一列与该列第一行中的元素进行比较,较小的元素应变为NA或0。
2) 如果第二个数据帧中的对应元素大于 0.05,则该元素应该再次变为 0。
示例如下所示:
set.seed(2)
a = sample(runif(5) ,rep=TRUE)
b = sample(runif(5) ,rep=TRUE)
c = sample(runif(5) ,rep=TRUE)
corr_mat = data.frame(a,b,c)
a = sample(runif(5,0,0.1) ,rep=TRUE)
b = sample(runif(5,0,0.1) ,rep=TRUE)
c = sample(runif(5,0,0.1) ,rep=TRUE)
p_values= data.frame(a,b,c)
所以我想对 corr_mat 进行子集化,在 a 列中只剩下那些大于 a 列中的第 1 行的值,并且 p_values 中相应的 p 值小于 0.05。
这是我希望这些值的输出:
> corr_mat
a b c
1 0.9438393 0.4052822 0.8368892
2 0.1848823 0.4052822 0.6618988
3 0.9438393 0.2388948 0.3875495
4 0.5733263 0.7605133 0.3472722
5 0.5733263 0.5526741 0.6618988
> p_values
a b c
1 0.086886104 0.01632009 0.02754012
2 0.051428176 0.09440418 0.09297202
3 0.016464224 0.02970107 0.02754012
4 0.086886104 0.01150841 0.09297202
5 0.001041453 0.09440418 0.09297202
目标输出(基于第一个条件,大于或等于每列的第一行值):
> corr_mat
a b c
1 0.9438393 0.4052822 0.8368892
2 0.4052822
3 0.9438393
4 0.7605133
5 0.5526741
目标输出(基于两个条件——现在不包括对应的大于 0.05 的 p 值):
> corr_mat
a b c
1 0.9438393 0.4052822 0.8368892
2
3 0.9438393
4 0.7605133
5
我的想法是这样的:
apply(corr_mat_df,2, comp)
其中 comp 被定义为比较 corr_mat 中 a 列的第 1 行和 p_values 中的相应元素的东西。
comp<-function(df1,df2) {
for (i in 1:length(df1)) {
if (df[i]<df[1] & df2[i]>0.05){
df[i]=NA
}
}
}
【问题讨论】:
-
corr_mat[1,1]的输出应该是NA对吧?因为p_values[1, 1]是 0.086886104 大于 0.05 ? -
嗯,其实我没想到。两种选择(NA 和不 NA,即使 p_val 我们大于 0.05)实际上对我的分析有意义,如果需要,我现在可以自己更改它,如果需要使用您提供的解决方案。