【问题标题】:Count occurrences of values based on value in different columns根据不同列中的值计算值的出现次数
【发布时间】:2016-03-30 13:14:12
【问题描述】:

我有这样的桌子。列名 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 次​​p>

编辑:

这是我的数据样本,有 31 列...我想要做的是,我想计算一个特定值出现了多少次,除非另一个特定值出现在下一列中。

图中的例子,我想数一下值112出现的次数,出现了多少次?如果“116”出现在下一列中,则除外。

如果需要更多说明,请给我评论。

【问题讨论】:

  • 当你的意思是在之后,你是指在它的右边的列中还是在下面的行中?
  • @DeveaP 我的意思是它的右栏,我会更新我的帖子
  • 如果 3 出现在最后一列而 1 出现在下面一行的第一列怎么办?澄清一下:元素 (1,4) 是 3,元素 (2,1) 是 1。这 3 是否要计算?
  • @rawr 抱歉,这是一张桌子
  • 如果在“3”的同一行中有一个“1”,你会算有效吗,不是连续的,而是在一个有 3 的那一行的几列之后?

标签: r sum


【解决方案1】:

我会尝试:

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")))

【讨论】:

    【解决方案2】:

    在以下代码中,我假设“之后”表示其右侧的列。

    您想要的是事件的总和:“第 x 列和第 x+1 列中的 3 与 1 不同”。

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

    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)
    

    【讨论】:

    • @RHertel 我将编辑我的答案以说明这一点,感谢您指出。
    • 顺便说一句,你的代码工作正常,只是花了我时间尝试和尝试
    猜你喜欢
    • 2016-05-20
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多