首页 > 解决方案 > R:在更改点更新列值的 Tidyverse 方法(有什么问题?)

问题描述

如果值发生变化,我想更新列的值。例如,在以下数据中,我想grp基于value列创建列,该列是表示变化点的二进制变量。我试图通过创建来尝试它,temp1但结果不是我想要的。

library(tidyverse)
as_tibble(c(1,0,0,0,1,0,1,0)) %>%
      mutate(temp1 = 1,
        lag_temp1 = lag(temp1,1,default = 1),
        temp1 =  ifelse(row_number() ==1,1,value + lag_temp1)) %>%   
      mutate(grp = c(1,1,1,1,2,2,3,3)) %>% 
      print

    # A tibble: 8 x 4
      value temp1 lag_temp1   grp
      <dbl> <dbl>     <dbl> <dbl>
    1     1     1         1     1
    2     0     1         1     1
    3     0     1         1     1
    4     0     1         1     1
    5     1     2         1     2
    6     0     1         1     2
    7     1     2         1     3
    8     0     1         1     3

更新

除了grp正确获取之外,我还想知道为什么我的解决方案不起作用。我在数据分析的其他地方也使用了类似的逻辑。知道错误在哪里对我很有帮助?除了内置之外,cumsum我有时可能不得不使用其他功能。

标签: rdplyrtidyverse

解决方案


为了得到grp正确的变量,我们可以使用cumsum

library(tidyverse)
as_tibble(c(1, 0, 0, 0, 1, 0, 1, 0)) %>% 
  mutate(grp = cumsum(value))
 # A tibble: 8 x 2
#  value   grp
#  <dbl> <dbl>
#1     1     1
#2     0     1
#3     0     1
#4     0     1
#5     1     2
#6     0     2
#7     1     3
#8     0     3

temp1在您的解决方案中,首先没有区别lag_temp1

as_tibble(c(1,0,0,0,1,0,1,0)) %>%
  mutate(temp1 = 1,
         lag_temp1 = lag(temp1, 1, default = 1))

所以到底temp1是简单的c(value[1], value[-1] + 1)

我并不完全清楚“除了内置之外, cumsum 我有时可能不得不使用其他功能”是什么意思。- 因为这取决于具体情况。对于上面的示例cumsum,可以完成这项工作。


推荐阅读