所以我有一个数据帧,PVALUES,像这样:
PVALS <- read.csv(textConnection("PVAL1 PVAL2 PVAL3
0.1 0.04 0.02
0.9 0.001 0.98
0.03 0.02 0.01"),sep = " ")
这对应于另一个数据帧DATA,如下所示:
DATA <- read.csv(textConnection("COL1 COL2 CO3
10 2 9
11 20 200
2 3 5"),sep=" ")
对于DATA
中的每一行,我想取其索引对应于PVALUES
中&lt; = 0.05的条目的数字的平均值。
因此,例如,PVALUES
中的第一行只有两个条目&lt; = 0.05,[1,2]和[1,3]中的条目。因此,对于DATA
的第一行,我想取平均值2和9。
在PVALUES
的第二行中,只有条目[2,2]是&lt; = 0.05,所以我不会使用第二行DATA的均值,而是使用DATA[20,20]
所以,我的输出看起来像是:
MEANS
6.5
20
3.33
我想我可能能够为PVALUES中的每个条目生成索引&lt; = 0.05,然后使用它来选择DATA中用于平均值的条目。我尝试使用此命令生成索引:
exp <- which(PVALUES[,]<=0.05, arr.ind=TRUE)
...但它只会获取第一列<= 0.05的条目的索引。在上面的例子中,它只输出[3,1]。
任何人都可以看到我做错了什么,或者有关于如何解决这个问题的想法?
谢谢!
答案 0 :(得分:6)
看起来有点滑稽,但这应该有用
rowMeans(`is.na<-`(DATA,PVALUES>=.05), na.rm=T)
“丑陋”部分在没有进行自动替换的情况下调用is.na<-
,但是在这里我们只是将p值大于.05的所有数据设置为缺失,然后采用行方式。
我不清楚你使用exp
做了什么,但这种方法也可以。也许与
expx <- which(PVALUES[,]<=0.05, arr.ind=TRUE)
aggregate(val~row, cbind(expx,val=DATA[exp]), mean)
(重命名为不干扰内置exp()
功能)
使用
进行测试PVALUES<-read.table(text="PVAL1 PVAL2 PVAL3
0.1 0.04 0.02
0.9 0.001 0.98
0.03 0.02 0.01", header=T)
DATA<-read.table(text="COL1 COL2 CO3
10 2 9
11 20 200
2 3 5", header=T)
答案 1 :(得分:1)
我通常喜欢MrFlick的回复,但以这种方式使用is.na<-
似乎违反了我对R代码的期望,因为它破坏性地修改了数据。我承认我可能应该因为任务箭而期待这种可能性,但它让我感到惊讶。 (我不反对data.table代码,因为它使用:=
函数修改其内容时非常谨慎。)我也承认我努力改进它的一个它导致我在一个兔子洞里我发现这同样是“baroke”的努力。 (你错误地平均了2和9)
sapply( split( DATA[which( PVALS <= 0.05, arr.ind=TRUE)],
which( PVALS <= 0.05, arr.ind=TRUE)[,'row']),
mean)
1 2 3
5.500000 20.000000 3.333333