【问题标题】:Changing Values in a Matrix based on a condition根据条件更改矩阵中的值
【发布时间】:2015-07-27 16:18:20
【问题描述】:

所以我看到了很多关于通过矩阵的一些简单索引来更改小于等于零的某个数字的矩阵中的所有值的帖子。但我认为我所拥有的更先进一些,我遇到了一些麻烦,所以希望你们能提供帮助。这是我正在使用的代码:

x <- (1:5)
y <- c(0,10,0,0,8)
n <- 12 

mat <- t(sapply(y, function(test) pmax(seq(test, (test-n+1), -1), 0) ))
mat

这会产生:

      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
[1,]    0    0    0    0    0    0    0    0    0     0     0     0
[2,]   10    9    8    7    6    5    4    3    2     1     0     0
[3,]    0    0    0    0    0    0    0    0    0     0     0     0
[4,]    0    0    0    0    0    0    0    0    0     0     0     0
[5,]    8    7    6    5    4    3    2    1    0     0     0     0

xmat <- replicate(ncol(mat),x)

然后我想找出哪个 y 不等于 0,然后将 xmat 中的值替换为零,直到 mat 等于 0,然后将值更改为 x 值。所以下面是我目前拥有的。

CountTest <- which(y != 0)

xmat[CountTest,] <- apply(xmat[CountTest,], 1, function(xu) ifelse(xu > 0, 0, xu))
xmat

这会产生:

      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
[1,]    1    1    1    1    1    1    1    1    1     1     1     1
[2,]    0    0    0    0    0    0    0    0    0     0     0     0
[3,]    3    3    3    3    3    3    3    3    3     3     3     3
[4,]    4    4    4    4    4    4    4    4    4     4     4     4
[5,]    0    0    0    0    0    0    0    0    0     0     0     0

想要的输出是:

       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
[1,]    1    1    1    1    1    1    1    1    1     1     1     1
[2,]    0    0    0    0    0    0    0    0    0     0     2     2
[3,]    3    3    3    3    3    3    3    3    3     3     3     3
[4,]    4    4    4    4    4    4    4    4    4     4     4     4
[5,]    0    0    0    0    0    0    0    0    5     5     5     5

【问题讨论】:

    标签: r matrix apply


    【解决方案1】:

    你可以试试

    > xmat*(mat==0)
    #     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
    #[1,]    1    1    1    1    1    1    1    1    1     1     1     1
    #[2,]    0    0    0    0    0    0    0    0    0     0     2     2
    #[3,]    3    3    3    3    3    3    3    3    3     3     3     3
    #[4,]    4    4    4    4    4    4    4    4    4     4     4     4
    #[5,]    0    0    0    0    0    0    0    0    5     5     5     5
    

    【讨论】:

    • 所以我已经在 R 中工作了一段时间,但我不确定什么时候像你刚才那样将某些东西强制转换为二进制文件。你有什么建议还是我应该把它作为一个单独的问题发布?
    • 逻辑值TRUEFALSE 分别转换为数字10,只要它与算术运算(如加法或乘法)结合使用。例如,(5 &gt; 2) + 0 将产生1,正如(2==2) * 1 的结果是1。我不知道这些例子是否回答了你的问题。如果你觉得你需要更多的澄清,也许你可以发布一个单独的问题。
    • 基本上你的意思是,在这种情况下,强制转换成二进制会被认为是有用的,因为我们本质上是把它变成一个 TRUE 或 FALSE 语句。所以你的回答反映了这个逻辑。
    • 我们的意思可能相同,但我想我会说得有点不同。比较mat==0 产生一个矩阵,其中包含逻辑项TRUEFALSE。因为xmat 是数字,所以只有当乘数也是数字时,乘法才有意义。这被R 识别,因此逻辑值被强制转换为数字值。当然还有更正式的方式来描述强制转换,这与各种类型变量的不同灵活性有关,但这种简单的描述可能足以解释大多数情况。
    • the recent book by Hadley Wickham 中的“强制”部分提供了有关此主题的更准确信息。
    猜你喜欢
    • 2012-08-12
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 2019-03-06
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 2021-01-09
    相关资源
    最近更新 更多