IF "OR" 多个条件
IF "OR" multiple conditions
我有一个标准的 2x2 table
Yes No
Yes a b
No c d
我想创建一个条件,使 IF(a or b or c or d = 0) then 0.5 被添加到每个单元格 a、b、c、d。
我试过这个:
if(a && b && c && d == 0){
a=a+0.5, b=b+0.5, c=c+0.5, d=d+0.5
}
但是我收到一条错误消息
Error: unexpected ',' in:
"if(a && b && c && d== 0){
a=a+0.5,"
即我不认为它让我可以执行多项操作。
另外,我认为 &&
不在每个字母之间,因为我认为这意味着 IF(a and b and ...)
问题更新:
我还有一个相关问题。
如果我说了一组say n tables,所有的格式都是:
Yes No
Yes a b
No c d
并且如果 n tables 中的任何一个中的 a、b、c 或 d 之一等于零,则将 0.5 添加到每个 a、b、c、d 中在 n table 中。我该怎么做?
我的列表如下所示:
n11 n12 n21 n22
1 188 1157 173 1168
2 2 201 1 101
3 369 2280 354 2289
4 1 61 0 61
5 1306 16870 1333 16773
6 4 81 3 79
7 6 117 5 118
8 19 334 15 318
9 1 49 0 48
10 0 36 1 33
11 2 114 3 113
12 13 433 37 696
13 1 64 0 65
14 4 157 1 160
15 1 42 0 43
16 1 150 5 146
17 7 1124 10 1117
18 2 78 2 77
我想说的是,如果 table 的单元格的任何方面为 0,那么我希望将 0.5 添加到每个单元格。
问题在于分隔变量的逗号。 R 语法不允许您这样做。这样写:
if (a && b && c && d == 0){
a=a+0.5
b=b+0.5
c=c+0.5
d=d+0.5
}
另一个问题是您描述的行为与您的代码不匹配。如果你写&&,它的意思是and,不是or。如果要检查每个元素是否等于0,应该这样写:
根据 Rodrigo 的评论修改,正确的代码为:
if (0 %in% c(a,b,c,d)){
a=a+0.5
b=b+0.5
c=c+0.5
d=d+0.5
}
在 R 中你不能使用 ,
来分隔行,但是你可以使用 ;
.
此外,您的做法将 a,b and c
视为布尔值 (TRUE/FALSE
),但事实并非如此,因为它们是数字。你的条件应该是:
if (a == 0 || b == 0 || c == 0 || d == 0)
请注意,即使 a,b and c
不是布尔值,您的代码仍然会 运行,因为它们是数字并且 FALSE
和 a == 0
之间存在等价关系。这意味着您也可以将您的条件写为:
if (!a || !b || !c || !d)
对于更新,我认为 matList
是矩阵列表:
for (ii in 1:length(matList())) {
if (any(matList[[ii]] == 0)) {
matList = lapply(matList, function(X){X+0.5})
break # Exit the for loop
}
}
lapply
对列表 matList
和 returns 结果列表。
我有一个标准的 2x2 table
Yes No
Yes a b
No c d
我想创建一个条件,使 IF(a or b or c or d = 0) then 0.5 被添加到每个单元格 a、b、c、d。
我试过这个:
if(a && b && c && d == 0){
a=a+0.5, b=b+0.5, c=c+0.5, d=d+0.5
}
但是我收到一条错误消息
Error: unexpected ',' in:
"if(a && b && c && d== 0){
a=a+0.5,"
即我不认为它让我可以执行多项操作。
另外,我认为 &&
不在每个字母之间,因为我认为这意味着 IF(a and b and ...)
问题更新:
我还有一个相关问题。
如果我说了一组say n tables,所有的格式都是:
Yes No
Yes a b
No c d
并且如果 n tables 中的任何一个中的 a、b、c 或 d 之一等于零,则将 0.5 添加到每个 a、b、c、d 中在 n table 中。我该怎么做?
我的列表如下所示:
n11 n12 n21 n22
1 188 1157 173 1168
2 2 201 1 101
3 369 2280 354 2289
4 1 61 0 61
5 1306 16870 1333 16773
6 4 81 3 79
7 6 117 5 118
8 19 334 15 318
9 1 49 0 48
10 0 36 1 33
11 2 114 3 113
12 13 433 37 696
13 1 64 0 65
14 4 157 1 160
15 1 42 0 43
16 1 150 5 146
17 7 1124 10 1117
18 2 78 2 77
我想说的是,如果 table 的单元格的任何方面为 0,那么我希望将 0.5 添加到每个单元格。
问题在于分隔变量的逗号。 R 语法不允许您这样做。这样写:
if (a && b && c && d == 0){
a=a+0.5
b=b+0.5
c=c+0.5
d=d+0.5
}
另一个问题是您描述的行为与您的代码不匹配。如果你写&&,它的意思是and,不是or。如果要检查每个元素是否等于0,应该这样写:
根据 Rodrigo 的评论修改,正确的代码为:
if (0 %in% c(a,b,c,d)){
a=a+0.5
b=b+0.5
c=c+0.5
d=d+0.5
}
在 R 中你不能使用 ,
来分隔行,但是你可以使用 ;
.
此外,您的做法将 a,b and c
视为布尔值 (TRUE/FALSE
),但事实并非如此,因为它们是数字。你的条件应该是:
if (a == 0 || b == 0 || c == 0 || d == 0)
请注意,即使 a,b and c
不是布尔值,您的代码仍然会 运行,因为它们是数字并且 FALSE
和 a == 0
之间存在等价关系。这意味着您也可以将您的条件写为:
if (!a || !b || !c || !d)
对于更新,我认为 matList
是矩阵列表:
for (ii in 1:length(matList())) {
if (any(matList[[ii]] == 0)) {
matList = lapply(matList, function(X){X+0.5})
break # Exit the for loop
}
}
lapply
对列表 matList
和 returns 结果列表。