【问题标题】:Count cumulative and sequential values of the same sign in R计算R中相同符号的累积值和顺序值
【发布时间】:2021-11-02 22:55:49
【问题描述】:

我正在寻找 R 中与 python 中this post 的等效代码,用于添加一个列,该列累积计算前一列中正值和负值的数量。

我发现了许多累积和或更复杂的示例,但我只想计算一排中正数和负数的数量,只要符号发生变化就会重置。请参阅示例代码。

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

当数据帧 df 仅以“x”开头时,我希望 R 使用 mutate 函数创建列“z”。

【问题讨论】:

标签: r


【解决方案1】:

你可以试试:

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

编辑下面的寻址 OP 评论:

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 - 见编辑。
  • 这太棒了!!!!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-06
  • 2013-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多