掩码上的Ifelse条件

时间:2016-09-13 14:54:56

标签: r if-statement

我有问题。想象一下,我有一个数据集:

     row1 row2 row3
col1  2    3    5
col2  5    3    4
col3  3    1    6

我有一个面具,用于识别应该转换的条目:

     row1 row2 row3
col1  T    F    F
col2  F    F    T
col3  F    T    F

所以基本上,我希望所有标记为TRUE(T)的条目都被它们现在的值减去另一个数据集b中的值所取代:

     row1 row2 row3
col1  1    4    8
col2  4    1    1
col3  6    2    7

所以结果应该是:

     row1 row2 row3
col1  1    3    5
col2  5    3    3
col3  3   -1    6

我试过的是:

new_dataset <- ifelse(Mask == 'FALSE', a, a - b)

但是,我最终得到的是列表而不是数据框。我知道,这是因为R通过总数据集a或(a-b)创建列表中的每个条目。但我该怎么处理呢?

非常感谢您提前! :)

3 个答案:

答案 0 :(得分:2)

你可以a - b * mask

a - b * mask
#      row1 row2 row3
# col1    1    3    5
# col2    5    3    3
# col3    3   -1    6

它适用于数据帧和矩阵:

as.data.frame(a) - as.data.frame(b) * as.data.frame(mask)
#      row1 row2 row3
# col1    1    3    5
# col2    5    3    3
# col3    3   -1    6

as.matrix(a) - as.matrix(b) * as.matrix(mask)
#      row1 row2 row3
# col1    1    3    5
# col2    5    3    3
# col3    3   -1    6

答案 1 :(得分:1)

假设所有数据集都是data.frame s,我们将'i1'(即TRUE / FALSE数据集)转换为matrix,使用它来从'a'和'b'中提取元素,减去相应的元素并将其分配给'i',对于'i1'为真。

i2 <- as.matrix(i1)
a[i2] <- a[i2] - b[i2]
a
#     row1 row2 row3
#col1    1    3    5
#col2    5    3    3
#col3    3   -1    6

或者如果数据集非常大,那么循环遍历列可能会更有效。我们可以使用mapply根据'i1'中的索引列将'a'的相应列替换为'b'

mapply(function(x, y, z) {x[z] <- x[z] - y[z]; x}, a, b, i1)

答案 2 :(得分:0)

另一种方式:

res <- a-b
w <- which(mask==F, arr.ind = T)
res[w] <- a[w]

OR

res <- a
res[mask] <- a[mask]-b[mask]

#      row1 row2 row3
# col1    1    3    5
# col2    5    3    3
# col3    3   -1    6

w包含a中保持不变的值。