阈值矩阵

时间:2018-04-13 15:53:15

标签: r loops filter threshold

我正在尝试将滤镜应用于大型矩阵。矩阵“logcounts1”由8978行和4列组成。

每行应该应用过滤器,因此我可以选择其中至少有一个值超出间隔的那些行。过滤器使用由每行平均值组成的区间作为中心值+ - 标准偏差。每行的平均值和SD分别包含在矢量“Average1”和“SDr1”中。

我还为行定义了矩阵“alpha”,其中至少有一列值超出了间隔范围,“beta”用于存储其值始终保持在间隔中的行。

for (i in 1:8978) {
if (logcounts1[i,1] > average1 [i]+SDr1[i] | logcounts1[i,2] > average1 [i]+SDr1[i] | logcounts1[i,3] > average1 [i]+SDr1[i] | logcounts1[i,4] > average1 [i]+SDr1[i] | logcounts1[i,1] < average1 [i]+SDr1[i] | logcounts1[i,2] < average1 [i]+SDr1[i] | logcounts1[i,3] > average1 [i]+SDr1[i] | logcounts1[i,4] > average1 [i]+SDr1[i]) {
alpha <- rbind(alpha,logcounts1[i,])
} else {
beta <- rbind(beta, logcounts1[i,])
}
}

我真的希望你能帮助我们,我对此非常陌生。最好成绩

I made an example on excel&lt; - 点击此处

基本上,红细胞是间隔的值(平均值+ -StandardDeviation)。然后,具有超出范围值的行1,2和5应存储在新的矩阵“alpha”中,因此输出应为:

Alpha selected matrix

此外,不包含任何超出范围值的行也应存储在输出的另一个矩阵(“beta”)中:

Beta selected matrix

1 个答案:

答案 0 :(得分:0)

我已经选择了非循环方法,而是使用子集。顶部只是生成可重复的数据。第7列和第8列是我计算下限和上限(平均值 - SD和平均值+ SD)的地方。然后我使用range将行的最低值和最高值拉到第9列和第10列(没有必要将这些作为列添加,但我确实帮助向您展示了正在发生的事情)。

然后我使用子集函数。 alpha的规则是最低观察值小于平均值 - SD (|)最高观察值大于平均值+ SD。 beta的规则是最低观察值大于或等于平均值​​ - SD (&amp;)最高观察值小于或等于平均值​​+ SD。

# Dummy Data
df1 <- data.frame(matrix(c(rnorm(40, 0, 1)), ncol = 4))
df1[,5] <- apply(df1[,1:4], 1, mean)
df1[,6] <- sqrt(apply(df1[,1:4], 1, var))

# Add Mean and SD
df1[,7] <- df1[,5] - df1[,6]
df1[,8] <- df1[,5] + df1[,6]

# Get Range of Values of in 1:4
df1[,9]  <- apply(df1[,1:4], 1, range)[1,]
df1[,10] <- apply(df1[,1:4], 1, range)[2,]

# Split
alpha <- subset(df1, df1[,9] <  df1[,7] | df1[,10] >  df1[,8])
beta  <- subset(df1, df1[,9] >= df1[,7] & df1[,10] <= df1[,8])

# Clean up
df1[,c(7:10)] <- NULL