在 R 中计算相同符号的累积和连续值

4
我正在寻找R语言中相当于Python中此帖子的代码,用于添加一列,该列累加计算前一列中正数和负数值的数量。
我已经找到了许多累积和或更复杂的示例,但我只想在重置符号时计算一行中正数和负数的数量。请参见示例代码。
library(dplyr)
df <- data.frame(x = c(0.5, 1, 6.5, -2, 3, -0.2, -1))

我的期望输出是这样的:

df <- data.frame(x = c(0.5, 1, 6.5, -2, 3, -0.2, -1), 
                 z = c(1,2,3,-1,1,-1,-2))

我希望使用 R 语言的 mutate 函数,在数据框 df 中,当列名以 "x" 开头时,创建一列名为 "z" 的新列。


相关:在连续的值运行中创建计数器;例如 sn = sign(x); rowid(rleid(sn)) * sn - Henrik
1个回答

5

您可以尝试:

library(dplyr)

df %>%
  mutate(z = with(rle(sign(x)), sequence(lengths) * rep(values, lengths)))

     x  z
1  0.5  1
2  1.0  2
3  6.5  3
4 -2.0 -1
5  3.0  1
6 -0.2 -1
7 -1.0 -2

你可能需要考虑如何处理零,因为如果向量中存在零,上述方法可能需要进行修改。也许可以这样:

df %>%
   mutate(z = with(rle(sign(x)), sequence(lengths) * rep(values^(values != 0), lengths)))

编辑回复下面的评论:

df %>%
  mutate(z = with(tmp <- rle(sign(x)), sequence(lengths) * rep(values, lengths)),
         id = with(tmp, rep(seq_along(lengths), lengths))) %>%
  group_by(id) %>%
  mutate(avg = cumsum(x)/row_number()) %>%
  ungroup() %>%
  select(-id)

# A tibble: 7 x 3
      x     z   avg
  <dbl> <dbl> <dbl>
1   0.5     1  0.5 
2   1       2  0.75
3   6.5     3  2.67
4  -2      -1 -2   
5   3       1  3   
6  -0.2    -1 -0.2 
7  -1      -2 -0.6 

以上的解决方案完美地运行了。我有一个后续问题。如何在“z”的右侧添加另一列,对相同符号的所有先前数字进行累积平均?因此,如果列名为“avg”,第1行将等于0.5,第2行= 0.75,第3行= 2.67,第4行= -2,第5行= 3,第6行= -0.2,第7行= -0.6。 - Jcarl
@Jcarl - 请查看编辑。 - Ritchie Sacramento
这太棒了!!!非常感谢! - Jcarl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接