【问题标题】:Logical operators in if-else in RR中if-else中的逻辑运算符
【发布时间】:2013-06-13 11:30:17
【问题描述】:

我有一张名为 mat 的表格(5 列和 3 行):

AC CA RES
1   0  
2   2 
1   3 
0   0 
0   1

正在执行的操作是mat[1]/mat[1]+mat[2]

我正在测试以下内容: 1) 如果一行的两列都为零,则结果应为 NA。 2) 如果一行中只有一列为零,而另一列为非零数,则继续计算。 (即使分子为0也没关系)

我目前在逐行的 for 循环中使用这个 if-else 结构:

if(mat[b,1]>=0|mat[b,2]>=0){mat[b,3]<-(mat[b,1]/(mat[b,1]+mat[b,2]));}
else{is.na(mat[b,3])=TRUE;}

我收到以下错误:

1: In Ops.factor(mat[b, 1], 0) : >= not meaningful for factors
2: In Ops.factor(mat[b, 2], 0) : >= not meaningful for factors

有没有更流畅的方法?

数字总是整数,并且总是 0 或更大。 我想使用apply,但是如何直接将apply 的结果分配到第三列?

【问题讨论】:

    标签: r math loops logical-operators


    【解决方案1】:

    要获得结果,您不需要 for 循环,只需使用 ifelse()。如果您的数据框mat 中的列是数字而不是因素(正如@Arun 在评论中指出的那样),这将起作用。

    mat$RES<-ifelse(mat[,1]==0 & mat[,2]==0,NA,mat[,1]/(mat[,1]+mat[,2]))
    
     mat
      AC CA  RES
    1  1  0 1.00
    2  2  2 0.50
    3  1  3 0.25
    4  0  0   NA
    5  0  1 0.00
    

    【讨论】:

    • 很好,但这仍然不是错误。您必须这样做:mat[] &lt;- lapply(mat, function(x) as.numeric(as.character(x))) 将列从因子转换为数字。
    • 把你的两个回答放在一起,让它像一个魅力。谢谢你们两个:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多