根据不同列

时间:2016-03-30 13:14:12

标签: r sum

我有这样的表。列名V1,V2,V3,V4

V1 | V2 | V3 | V4
2  |  4 | 3  |  1
2  |  1 | 3  |  1
2  |  3 | NA |  NA
2  |  4 | 3  |  1
3  | NA | NA | NA

如何计算数字“3”的出现次数,除非数字“1”在同一行后出现,我不希望它被计算在内。

在上面的例子中,值“3”的出现是2次

编辑:

这是我的数据样本,31列...我想要做的是,我想计算特定值发生了多少次,除非下一列中有另一个特定值。< / p> 从图片的例子来看,我想计算值112的出现次数,它发生了多少次?如果“116”出现在下一栏中,则计算除外。

如果需要更多说明,请发表评论。

enter image description here

2 个答案:

答案 0 :(得分:3)

我试试:

sum(tb[,1:3]==3 & (tb[,2:4]!=1 | is.na(tb[,2:4])),na.rm=TRUE)
#[1] 2

我使用的数据:

tb <- structure(c(2L, 2L, 2L, 2L, 3L, 4L, 1L, 3L, 4L, NA, 3L, 3L, NA, 
3L, NA, 1L, 1L, NA, 1L, NA), .Dim = c(5L, 4L), .Dimnames = list(
    NULL, c("V1", "V2", "V3", "V4")))

答案 1 :(得分:2)

在下面的代码中,我假设&#34;&#34;&#34;表示右侧的列。

你想要的是事件的总和:&#34;列x和&amp ;;列x + 1与1&#34;不同。

您可以将其翻译成以下代码(虽然可能效率不高):

TOTAL<-0    
for( i in 1:(ncol(df)-1){
   TOTAL<-TOTAL + sum(df[,i]==3 & df[,i+1]!=1, na.rm= TRUE)
}

修改:考虑最后一栏

TOTAL<-TOTAL+sum(df[,ncol(df)]==3 , na.rm = TRUE)

所以完整的代码是:

TOTAL<-0    
for( i in 1:(ncol(df)-1){
   TOTAL<-TOTAL + sum(df[,i]==3 & df[,i+1]!=1,na.rm = TRUE)
}
TOTAL<-TOTAL+sum(df[,ncol(df)]==3, na.rm = TRUE)