如何计算每列二进制事务的频率,并在R的最后一行之后添加结果?

时间:2013-11-10 10:28:41

标签: r

我有一个txt文件(data5.txt):

1   0   1   0   0

1   1   1   0   0

0   0   1   0   0

1   1   1   0   1

0   0   0   0   1

0   0   1   1   1

1   0   0   0   0

1   1   1   1   1

0   1   0   0   1

1   1   0   0   0

我需要计算每列中一个和零的频率

如果频率为1> =频率为零,那么我将在该Colum的最后一行之后打印1

我是R的新手,但我试过了,我收到了错误:

Error in if (z >= d) data[n, i] = 1 else data[n, i] = 0 : 

  missing value where TRUE/FALSE needed

我的代码:

data<-read.table("data5.txt", sep="")

m =length(data)

d=length(data[,1])/2

n=length(data[,1])+1

for(i in 1:m)
{

    z=sum(data[,i])

    if (z>=d) data[n,i]=1 else data[n,i]=0
}

1 个答案:

答案 0 :(得分:2)

你可以试试这个:

rbind(df, ifelse(colSums(df == 1) >= colSums(df == 0), 1, NA))
#    V1 V2 V3 V4 V5
# 1   1  0  1  0  0
# 2   1  1  1  0  0
# 3   0  0  1  0  0
# 4   1  1  1  0  1
# 5   0  0  0  0  1
# 6   0  0  1  1  1
# 7   1  0  0  0  0
# 8   1  1  1  1  1
# 9   0  1  0  0  1
# 10  1  1  0  0  0
# 11  1  1  1 NA  1

更新,感谢@Arun的一个很好的建议:

rbind(df, ifelse(colSums(df == 1) >= ceiling(nrow(df)/2), 1, NA)

甚至:

rbind(df, ifelse(colSums(df == 1) >= nrow(df)/2, 1, NA)

感谢@SvenHohenstein。

可能我误解了你的预期结果。如果你希望0的频率为等于或大于零的频率,那么这就足够了:

rbind(df, colSums(df) >= nrow(df) / 2)

再次感谢@SvenHohenstein的有益评论!