我有两列数据,例如:
col1: c(1,2,3,0,7)
col2: c(4,5,6,7,3)
对于每一列,我想计算这个比率并将其作为列的最后一个值:
No. of values less than 5/(No. of values greater than 5 + No. of values lesser than 5)
第一列的结果因此应为4/4 + 1 = 0.2
我是R的新手,我能想到的唯一方法是循环整个列并使用if-else结构。还有更好的方法吗?
这是我不想使用的,因为它太笨重了:
for (a in 1:5)
{
if(col1<5){v1++;}
if(col1>5){v2++;}
}
v3<-v1/(v1+v2);
col1[6]<-v3;
当我执行上述操作时,我收到错误:
Error in if (col1[a] < 5) { : missing value where TRUE/FALSE needed
我确保列中的所有数字都是数字,那么为什么会出现这个错误?
答案 0 :(得分:3)
你的数学已关闭。
DF <- data.frame(col1=c(1,2,3,0,7), col2=c(4,5,6,7,3))
result <- apply(DF,2,function(x) sum(x<5)/(sum(x!=5)))
result
#col1 col2
# 0.8 0.5
答案 1 :(得分:1)
这将计算每列的比率并将其添加到最后一列:
rbind(dat,apply(dat,2,
function(x) c(sum(x<5)/(sum(x<5)+sum(x>5)))))
col1 col2
1 1.0 4.0
2 2.0 5.0
3 3.0 6.0
4 0.0 7.0
5 7.0 3.0
6 0.8 0.5
答案 2 :(得分:1)
矩阵方法:
> m <- cbind(c(1,2,3,0,7), c(4,5,6,7,3))
> m
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
[4,] 0 7
[5,] 7 3
> colSums(m<5)/colSums(m!=5)
[1] 0.8 0.5