我有下表(5列和3行),名为mat:
AC CA RES
1 0
2 2
1 3
0 0
0 1
正在执行的操作是mat[1]/mat[1]+mat[2]
我正在测试以下内容: 1)如果一行的两列都为零,则结果应为NA。 2)如果一行中只有一列为零而另一列为非零数字,则继续计算。 (即使分子为0,也没关系)
我目前正在逐行中使用这个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
的结果分配到第3列?
答案 0 :(得分:2)
要获得结果,您不需要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