首页 > 解决方案 > 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。我将不胜感激任何帮助。

标签: rconditional-statements

解决方案


你可以使用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"))

推荐阅读