【问题标题】:Filter/Subset R dateframe based on other dataframe基于另一个数据帧的过滤器/子集 R 数据帧
【发布时间】: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)实际上对我的分析有意义,如果需要,我现在可以自己更改它,如果需要使用您提供的解决方案。

标签: r dataframe subset


【解决方案1】:

我们也可以这样做

corr_mat *NA^(corr_mat < corr_mat[1,][col(corr_mat)] | p_values > 0.05 )
#         a         b         c
#1        NA 0.4052822 0.8368892
#2        NA        NA        NA
#3 0.9438393        NA        NA
#4        NA 0.7605133        NA
#5        NA        NA        NA

或者只是分配

corr_mat[corr_mat < corr_mat[1,][col(corr_mat)] | p_values > 0.05] <- NA

【讨论】:

  • 也很好,非常感谢。我会将这两种方法都添加到我的个人“备忘单”中,我相信它们都会派上用场。
【解决方案2】:

我们可以使用mapply 使用replace 一次性应用这两个条件。我们replace 的值满足NA 的条件之一。

mapply(function(x, y) replace(x, (x < x[1]) | (y > 0.05), NA),corr_mat, p_values)


#             a         b         c
#[1,]        NA 0.4052822 0.8368892
#[2,]        NA        NA        NA
#[3,] 0.9438393        NA        NA
#[4,]        NA 0.7605133        NA
#[5,]        NA        NA        NA

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    相关资源
    最近更新 更多