【问题标题】:R- Include starting point in cumsum functionR-在cumsum函数中包含起点
【发布时间】:2019-08-01 19:42:10
【问题描述】:

我有这个data.frame

       a b
 [1,]  1 0
 [2,]  2 0
 [3,]  3 0
 [4,]  4 0
 [5,]  5 0
 [6,]  6 1
 [7,]  7 2
 [8,]  8 3
 [9,]  9 4
[10,] 10 5

我想在column a 上应用cumsum,仅当column b 上的对应值不为0 时。

我在下面尝试了这个,但它不包括 cumsum 的起始条件:

   df_cumsum <- cbind(c(1:10), c(0,0,0,0,0,1,2,3,4,5),
                       as.data.frame(ave(A[,1], A[,2] != 0, FUN=cumsum)))

不幸的是,我在整个专栏中都获得了cumsum

    a b  c
1   1 0  1
2   2 0  3
3   3 0  6
4   4 0 10
5   5 0 15
6   6 1  6
7   7 2 13
8   8 3 21
9   9 4 30
10 10 5 40

我想获得:

    a b  c
1   1 0  0
2   2 0  0
3   3 0  0
4   4 0  0
5   5 0  0
6   6 1  6
7   7 2 13
8   8 3 21
9   9 4 30
10 10 5 40

感谢您的帮助!

【问题讨论】:

    标签: r dataframe cumsum multiple-conditions


    【解决方案1】:

    假设输入是df,如最后的注释中所示,试试这个。它将任何a 值归零,其中b 为0。

    transform(df, cum = cumsum((b > 0) * a))
    

    给予:

        a b cum
    1   1 0   0
    2   2 0   0
    3   3 0   0
    4   4 0   0
    5   5 0   0
    6   6 1   6
    7   7 2  13
    8   8 3  21
    9   9 4  30
    10 10 5  40
    

    注意

    我们假设此输入以可重现的形式显示:

    Lines <- "
      a b
      1 0
      2 0
      3 0
      4 0
      5 0
      6 1
      7 2
      8 3
      9 4
     10 5"
    df <- read.table(text = Lines, header = TRUE)
    

    更新

    ab 已颠倒。已经修好了。

    【讨论】:

      【解决方案2】:

      最好是创建索引并更新

      i1 <- df1$b > 0
      df1$c[i1] <- with(df1, cumsum(a[i1]))
      

      或者单行

      df1$c <- with(df1, cumsum(a * (b > 0)))
      df1$c
      #[1]  0  0  0  0  0  6 13 21 30 40
      

      【讨论】:

        【解决方案3】:

        我真的很喜欢其他答案使用a * (b &gt; 0) 时的干净程度,但这有时会让新程序员感到有些困惑。作为此语法的替代方法,您可以使用矢量化 ifelse 函数。

        df <- data.frame(a=c(1:10), b=c(0,0,0,0,0,1,2,3,4,5))
        # One way
        df$c <- cumsum(ifelse(df$b>0,df$a,0))
        # Another way
        df$d <- with(df,cumsum(ifelse(b>0,a,0)))
        

        【讨论】:

        • ifelse(logical check, what to do if TRUE, what to do if FALSE)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-22
        • 2019-06-27
        • 2019-07-26
        • 1970-01-01
        相关资源
        最近更新 更多