【问题标题】:Thresholding matrix阈值矩阵
【发布时间】:2018-09-24 01:05:00
【问题描述】:

我正在尝试将过滤器应用于大型矩阵。矩阵“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

基本上,红色单元格是区间内的值(mean+-StandardDeviation)。然后,具有超出范围值的第 1,2 和 5 行应存储在新矩阵“alpha”中,因此输出应为:

Alpha selected matrix

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

Beta selected matrix

【问题讨论】:

  • 你能展示一个小样本输入和输出吗?循环似乎没有必要,但如果没有测试用例就很难确定。只需共享一个包含 5 行和预期输出的示例矩阵。
  • 我其实不知道如何在cmets部分分享一个表...
  • 不要在 cmets 部分共享一个表。单击“编辑”按钮并在您的问题中分享。如果您在 R 中有一个表 x,您可以使用 dput(x) 获得一个复制/粘贴对象定义。如果你有一个大矩阵,你可以分享前 6 行的dput(head(x))。或者你可以分享一个类似x = matrix(c(...))的定义。
  • 好吧,我想我是按我的方式做的......
  • 数据图像没有用。我希望能够测试代码。我不想将您图片中的数字输入 R。请使用有效的 R 语法发布示例。

标签: r loops filter threshold


【解决方案1】:

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

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

【讨论】:

  • 你真的明白了!!太感谢了!!你让我很开心:D
  • 如果是这样,请接受答案(单击帖子旁边的勾号/检查)@FernandoDelgadoChaves
猜你喜欢
  • 1970-01-01
  • 2020-11-22
  • 1970-01-01
  • 2018-06-01
  • 1970-01-01
  • 2020-02-04
  • 1970-01-01
  • 2020-07-16
  • 2020-09-17
相关资源
最近更新 更多