我有问题。想象一下,我有一个数据集:
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)创建列表中的每个条目。但我该怎么处理呢?
非常感谢您提前! :)
答案 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
中保持不变的值。