r - ifelse 在 R : If either 3 conditions evaluated on 3 vectors is true, 中向所有向量添加一个常量

标签 r if-statement

我正在寻找使用 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/

相关文章:

r - 在日期向量 : Function very slow. 上使用 sapply 为什么?

r - 为使用 map() 创建的 ggplots 添加标题

javascript - 我想检查 Ember.js 中的所有表行

c++ - vector +for+if

r - R中的引导变量相关性

r - tidyverse:将特定日期与事件期间匹配

r - 如何将文本添加到 rasterVis levelplot 中的特定/固定位置

c++ - 在 C++ 中,If 语句后跟分号而不是大括号是什么意思?

python - 运行我的函数时,我的 if 语句未运行

javascript - 如何为匹配游戏更改两个 div 的颜色?