基于其他数据帧的筛选/子集R数据帧
我有两个数据帧,一个带有corr矩阵,另一个带有相应的p值(即,两者都是有序的,每个数据帧中的每个位置对应相同的变量)。我想根据两个条件过滤corr数据框中的元素: 1) 将每列与该列第一行中的元素进行比较,较小的元素应为NA或0 2) 如果第二个数据帧中的对应元素大于0.05,则该元素应再次变为0 示例如下所示:基于其他数据帧的筛选/子集R数据帧,r,dataframe,subset,R,Dataframe,Subset,我有两个数据帧,一个带有corr矩阵,另一个带有相应的p值(即,两者都是有序的,每个数据帧中的每个位置对应相同的变量)。我想根据两个条件过滤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(run
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_值中相应的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
目标输出(基于第一个条件,每列大于或等于第一行值):
目标输出(基于两种条件-现在不包括大于0.05的相应p值):
我的想法大致如下:
apply(corr_mat_df,2, comp)
其中comp定义为比较corr_mat中a列第1行和p_值中相应元素的值
comp<-function(df1,df2) {
for (i in 1:length(df1)) {
if (df[i]<df[1] & df2[i]>0.05){
df[i]=NA
}
}
}
comp我们可以使用mapply
使用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
mapply(函数(x,y)替换(x,(x0.05),NA),corr_mat,p_值)
#a、b、c
#[1,]NA 0.4052822 0.8368892
#[2,]NA-NA
#[3,]0.9438393 NA
#[4,]NA 0.7605133 NA
#[5,]NA-NA-NA
我们也可以通过
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*NA^(corr_-mat0.05)
#a、b、c
#1 NA 0.4052822 0.8368892
#2娜娜娜娜
#3 0.9438393不适用
#4 NA 0.7605133 NA
#5NA NA NA
或者只是分配
corr_mat[corr_mat < corr_mat[1,][col(corr_mat)] | p_values > 0.05] <- NA
corr_-mat[corr_-mat0.05]corr_-mat[1,1]
的输出应该是NA
对吗?因为p_值[1,1]
是0.086886104,大于0.05?嗯,实际上我没有想到这一点。这两种选择(NA和非NA,即使p_val us大于0.05)对于我的分析来说都是有意义的,如果需要您提供的解决方案,我现在可以自己更改。也非常好,非常感谢。我会在我的个人“备忘单”中添加这两种方法,我相信这两种方法都会派上用场。
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