【问题标题】:Compare values with a given standard row by row and write just 1 number for each row (exceeds / doesn't exceed the standard)逐行比较给定标准的值,每行只写一个数字(超过/不超过标准)
【发布时间】:2020-02-19 16:30:21
【问题描述】:

我有一个多行矩阵。比方说

M = matrix(1:20, nrow = 4, ncol = 5)

我有一个阈值变量,例如

threshold = c(4,7,11,14,17)

现在我希望 R 将矩阵中的每一行与这个阈值逐个进行比较,并告诉我该行中的至少一个值是否超过了这个阈值的对应值。即,M[1,1] 应与阈值 [1] 进行比较,M[1,2] 应与阈值 [2] 等进行比较。

理想情况下,我想要一个新变量,我们称之为检查,只有 1/FALSE(行中至少有 1 个值超过阈值)或 0/TRUE(没有这样的值)。 到目前为止,我可以编程的是这样的:

check = apply (M, MARGIN=1, (ifelse((M[,] < threshold), 1, 0)))

check = apply (check, MARGIN=1, sum)

check = check == 0

但是它有3个问题:

  1. 也许这不是解决问题的最佳方法?我有很多数据,我认为它可以工作得很慢..
  2. 它不起作用,R 说:

    check = apply (M, MARGIN=1, (ifelse((M[,]

  3. 即使我只是表演

    ifelse((M

我得到的第一行

[1,]    1    1    1    0    0

这不是真的,因为第一行中没有超过阈值的值。似乎 R 只是将整个第一行与阈值的第一个元素进行比较,然后将整个第二行与第二个值等进行比较,这不是我想要的......

非常感谢!

【问题讨论】:

  • 我认为,对于 (3),你得到了结果,因为 M 的第一行看起来像 1 2 3 4 5 并且 4 和 5 都不是 4
  • 但是矩阵是逐列创建的,所以第一行是(1,5,9,13,17),而不是(1,2,3,4,5) ... [, 1] [,2] [,3] [,4] [,5] [1,] 1 5 9 13 17 [2,] 2 6 10 14 18 [3,] 3 7 11 15 19 [4,] 4 8 12 16 20

标签: r threshold continuous


【解决方案1】:

你可以试试,

rowSums(t(M) > threshold) >= 1
#[1] FALSE  TRUE  TRUE  TRUE  TRUE

要逐行查看,

t((t(M) > threshold)*1) #---> ...* 1 just converts from logical to integer

#     [,1] [,2] [,3] [,4] [,5]
#[1,]    0    0    0    0    0
#[2,]    0    0    0    0    1
#[3,]    0    0    0    1    1
#[4,]    0    1    1    1    1

根据您的评论,

as.integer(rowSums(t((t(M) > threshold) * 1) > 0) > 0)
#[1] 0 1 1 1

【讨论】:

  • 对不起,但我希望它逐行比较,即我应该在最后得到 4 个值(每行一个)。在您的示例中,我得到 5 个值,因为它逐列比较
  • 我不明白你的意思。第一行还有 5 个值...1 1 1 0 0
  • @AlexM 请看一下。计算是正确的。只需另一个步骤即可获取逻辑(或二进制)关于哪一行的值大于其阈值。
【解决方案2】:
apply(M, 1, function(x) max(diag(sapply(x, function(y) y >threshold))))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 2021-01-12
    • 2021-07-08
    相关资源
    最近更新 更多