【问题标题】:How to create column totaling the number of instances of a binary value in R如何在R中创建总计二进制值实例数的列
【发布时间】:2019-10-16 15:41:08
【问题描述】:

我想在我的数据框中创建一个新列,该列将在任何给定点期间拥有财产的实例总数相加,在“拥有”列中表示为“1”。因此,只要有一个新的点,计数就会重置,并且一旦在控球列中计算了一个控球,就会在该点重新开始累加。

任何帮助将不胜感激。由于我来自 Excel 并且不知道自己在做什么但没有得到任何结果,因此我尝试过做几个 ifelse 语句。

起始数据集:

df<-data.frame(Point=c(1,1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3),
        Possession=c(1,NA,1,NA,1,NA,NA,1,NA,NA,NA,1,NA,NA,NA,1,NA,NA))

所需的输出:

Point Possession Possessions in Point
1     1          1
1     NA         1
1     1          2
1     NA         2
1     1          3
1     NA         3
1     NA         3
2     1          1
2     NA         1
2     NA         1
2     NA         1
2     1          2
2     NA         2
3     NA         0
3     NA         0
3     1          1
3     NA         1
3     NA         1

【问题讨论】:

    标签: r


    【解决方案1】:

    base 中,您可以将 avecumsum 结合使用,例如:

    df$"Possessions in Point"  <- ave(!is.na(df$Possession), df$Point, FUN=cumsum)
    df
    #   Point Possession Possessions in Point
    #1      1          1                    1
    #2      1         NA                    1
    #3      1          1                    2
    #4      1         NA                    2
    #5      1          1                    3
    #6      1         NA                    3
    #7      1         NA                    3
    #8      2          1                    1
    #9      2         NA                    1
    #10     2         NA                    1
    #11     2         NA                    1
    #12     2          1                    2
    #13     2         NA                    2
    #14     3         NA                    0
    #15     3         NA                    0
    #16     3          1                    1
    #17     3         NA                    1
    #18     3         NA                    1
    

    或者按照@Onyambu 的建议:

    transform(df,"Possessions in Point" = ave(!is.na(Possession),Point,FUN = cumsum))
    

    df$"Possessions in Point"  <- ave(replace(df$Possession, is.na(df$Possession), 0)
                                      , df$Point, FUN=cumsum)
    

    df$"Possessions in Point"  <- ave(ifelse(is.na(df$Possession), 0, df$Possession)
                                      , df$Point, FUN=cumsum)
    

    【讨论】:

    • transform(df,a = ave(!is.na(Possession),Point,FUN = cumsum)) 应该足够了
    • @Onyambu 哦,是的,好多了!我应该将它包含在答案中吗?
    • 继续。这就是我在这里写它的原因
    【解决方案2】:

    Base R 一班轮:

    df$total_pos <- unlist(sapply(split(df, df$Point), function(x){cumsum(ifelse(is.na(x$Possession), 0, x$Possession))}))
    

    数据:

        df<-data.frame(Point=c(1,1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3),
               Possession=c(1,NA,1,NA,1,NA,NA,1,NA,NA,NA,1,NA,NA,NA,1,NA,NA))
    

    【讨论】:

      【解决方案3】:

      此解决方案使用dplyr 和函数group_by() 以及cumsum()

      仅当我们将 NA 转换为 0 时它才有效,因为 cumsum 无法在 NA 上运行。如果这是一个问题,您可以使用带有条件 cumsum 的不同但更复杂的解决方案。

      library(dplyr)
      df<-data.frame(Point=c(1,1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3),
              Possession=c(1,NA,1,NA,1,NA,NA,1,NA,NA,NA,1,NA,NA,NA,1,NA,NA))
      
      df %>%
        group_by(Point) %>%
        mutate(Possession = case_when(is.na(Possession)~0,TRUE~Possession),Possession_in_Point = cumsum(Possession))
      

      【讨论】:

        【解决方案4】:

        您可以使用data.table 包如下:

        library(data.table)
        setDT(df)[, cumsum(nafill(Possession, fill = 0)), by = Point]
        

        如果你没有找到nafill的功能,你应该更新data.table包。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-03-27
          • 2023-03-21
          • 1970-01-01
          • 1970-01-01
          • 2021-08-31
          • 1970-01-01
          • 1970-01-01
          • 2016-07-09
          相关资源
          最近更新 更多