我正在寻找使用 ifelse 编写一个条件语句,它将同时评估 3 个向量上的 3 个条件。如果任一条件为真,则沿着向量,我喜欢向所有三个向量添加一个常量。
这是一个示例数据集:
a<-c(rep(0,5),rep(1,2))
b<-c(rep(0,6),rep(1,1))
c<-rep(5,7)
(data <- cbind(a,b,c))
a b c
[1,] 0 0 5
[2,] 0 0 5
[3,] 0 0 5
[4,] 0 0 5
[5,] 0 0 5
[6,] 1 0 5
[7,] 1 1 5
对于每一行,如果 a、b 或 c 为零,我想向这些值添加一个常数 k = 0.5。
这是条件语句后我的预期数据集:
k <- 0.5
exp.a exp.b exp.c
[1,] 0.5 0.5 5.5
[2,] 0.5 0.5 5.5
[3,] 0.5 0.5 5.5
[4,] 0.5 0.5 5.5
[5,] 0.5 0.5 5.5
[6,] 1.5 0.5 5.5
[7,] 1.0 1.0 5.0
我尝试了以下内容:
(exp.a <- (a + ifelse((a == 0), k, 0)))
如果向量 b 和 c 为零,上面的代码不会计算它们,所以这不是我要找的。我该如何编写 ifelse 语句,以便在每行的值为零的情况下计算所有 3 个向量,并且如果其中任何一个向量为零,则向该行中的所有值添加一个常数 k?
谢谢!
最佳答案
这是一种矢量化的可能性。一般来说,如果您只有一个条件(等于 0
),则实际上并不需要多个 ifelse
。语句,您只需对等于 0
的行求和即可并仅分配给他们
indx <- rowSums(data == 0L)
data[indx > 0L, ] <- data[indx > 0L, ] + 0.5
data
# a b c
# [1,] 0.5 0.5 5.5
# [2,] 0.5 0.5 5.5
# [3,] 0.5 0.5 5.5
# [4,] 0.5 0.5 5.5
# [5,] 0.5 0.5 5.5
# [6,] 1.5 0.5 5.5
# [7,] 1.0 1.0 5.0
或者,您可以尝试 data.table
软件包可能可以提高内存效率(如果您的矩阵很大)并通过引用更新您的列
library(data.table)
data <- as.data.table(data)
data[rowSums(data == 0L) > 0L, names(data) := lapply(.SD, function(x) x + 0.5)][]
# a b c
# 1: 0.5 0.5 5.5
# 2: 0.5 0.5 5.5
# 3: 0.5 0.5 5.5
# 4: 0.5 0.5 5.5
# 5: 0.5 0.5 5.5
# 6: 1.5 0.5 5.5
# 7: 1.0 1.0 5.0
关于r - ifelse 在 R : If either 3 conditions evaluated on 3 vectors is true, 中向所有向量添加一个常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28924611/