r - 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
我有时可能不得不使用其他功能。
解决方案
为了得到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
,可以完成这项工作。
推荐阅读
- spring-boot - 在 Junit 测试用例中动态传递一个值 Elasticsearch CRUD Ops
- ruby-on-rails - 无法将克隆后的数据从 GIT 迁移到服务器
- kubernetes - 了解 Kubernetes Pod 的 Istio AuthN 和 authz
- java - 为什么 GitLab runner 工作因多个 gradle 任务而失败?
- excel - 在 CATIA V5 VBA 中的曲线上添加新点
- java - @Autowired 在 Spring 中的类上
- node.js - 角度中的http调用问题。发不出去
- c# - 按下 gpio 按钮后更新 UI 元素
- c# - 编辑 NEW 使用 HttpPost 将数据从控制器传递到视图
- schema - Schema Browser 在 sql developer 上下文菜单中不可用 - 版本 3.3.20.10