r - R:从不同的起始值中减去列中的值
问题描述
我有一个如下所示的数据框:
a<-c(1,1,-1,1,-1,1,-1,1,1,1,1)
b<-c(0,200,0,0,0,45,0,0,30,0,0)
c<-c(3400,3403,3407,3408,3412,3423,3436,3245,3234,3456,2345)
df<-cbind(a,b,c)
df
我想要的输出如下所示:
a b c d
[1,] 1 0 3400 0
[2,] 1 200 3403 0
[3,] -1 0 3407 0
[4,] 1 0 3408 5
[5,] -1 0 3412 0
[6,] 1 45 3423 0
[7,] -1 0 3436 0
[8,] 1 0 3545 22
[9,] 1 30 3554 0
[10,] 1 0 3556 2
[11,] 1 0 3565 11
我想从 c 值计算出 c 列中值的差异,其中 b 列中的相应值不为 0,直到达到新的非零列 b 值,然后这个新值应该是新的起始值。另一个标准是,如果计算 c 列中的差异,则 a 列中的值必须相同。例如,第三行的 d 值为 0 而不是 4,因为第二行(起始行)的列 a 值为 1,第三行的 a 值为 -1。我将不胜感激任何帮助。
解决方案
你可以使用dplyr
:
library(dplyr)
df %>%
mutate(count = cumsum(b!=0)) %>%
group_by(count, a) %>%
mutate(m = n(),
d = ifelse(m > 1 & any(b != 0), c - first(c), 0)) %>%
ungroup() %>%
select(-count, -m)
返回
# A tibble: 11 x 4
a b c d
<dbl> <dbl> <dbl> <dbl>
1 1 0 3400 0
2 1 200 3403 0
3 -1 0 3407 0
4 1 0 3408 5
5 -1 0 3412 0
6 1 45 3423 0
7 -1 0 3436 0
8 1 0 3545 122
9 1 30 3554 0
10 1 0 3556 2
11 1 0 3565 11
注意:我认为您的测试数据和您想要的输出数据不一致。我使用了下面显示的数据。
数据
df <- structure(list(a = c(1, 1, -1, 1, -1, 1, -1, 1, 1, 1, 1), b = c(0,
200, 0, 0, 0, 45, 0, 0, 30, 0, 0), c = c(3400, 3403, 3407, 3408,
3412, 3423, 3436, 3545, 3554, 3556, 3565)), row.names = c(NA,
-11L), class = c("tbl_df", "tbl", "data.frame"))
推荐阅读
- iis - 收到 WebResource.axd 404 错误并且已经用完了选项
- javascript - 如何使触摸滑块响应
- java - 为什么不能在 Spring Boot 中接收可分页的详细信息?
- javascript - 自动删除在特定频道中发送的消息
- mvvm - 从 UWP 中的 CheckBox 调用方法是不好的做法吗
- c# - EF Core 逻辑查询
- firebase - Firebase 添加虚拟身份验证记录以进行无需验证的测试
- javascript - 如何在javascript中从html表单中获取数据
- html - 无法正确响应地制作图像网格堆栈。有两列堆叠不正确
- obfuscation - Red Gate - .NET Reflector Visual Studio Extension 版本 10 - Visual Studio 2017 - 需要禁用混淆