如果当前行和前一行满足某些条件,如何在R数据框中添加新列,以显示当前行和前一行的值之和? [英] How to add new column in R data frame showing sum of a value in a current row and a prior row, if certain conditions are met in the 2 rows?

查看:18
本文介绍了如果当前行和前一行满足某些条件,如何在R数据框中添加新列,以显示当前行和前一行的值之和?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设您有一个数据框,其中包含用df <- data.frame(a=c(0, 1, 2, 2, 3), b=c(1, 3, 8, 9, 4))生成的列&a";和";b";的值如下所示。假设您想添加一个列,如果a";中的值等于前一行中的值,则对列中对应的行值求和;否则将显示0值。下面添加了一列,以说明我正在尝试执行的操作:

   a  b   add col c
1  0  1       0
2  1  3       0
3  2  8       0
4  2  9       17 (since the values in col "a" rows 3 and 4 are equal, add the values in col b rows 3 and 4)
5  3  4       0

或在此方案中,&q;a&q;和&q;b&q;由df <- data.frame(a=c(0,1,2,2,2,3), b=c(1,2,3,4,5,6))

生成
   a  b    add col c
1  0  1        0
2  1  2        0
3  2  3        0
4  2  4        7 (3+4 from col "b")
5  2  5        9 (4+5 from col "b")
6  3  6        0 (since 2 from prior row <> 3 from current row)

在本机R中执行此操作的最简单方法是什么?

推荐答案

因为我们希望相邻的值相等,所以使用rleid(来自data.table)创建分组索引,然后通过将‘b’的lag添加到‘b’来创建‘c’,并将默认的第一个值lag(NA)替换为0

library(dplyr)
library(data.table)
library(tidyr)
df %>% 
   group_by(grp = rleid(a)) %>% 
   mutate(c = replace_na(b + lag(b), 0)) %>%
   ungroup %>%
   select(-grp)

-输出

# A tibble: 6 × 3
      a     b     c
  <dbl> <dbl> <dbl>
1     0     1     0
2     1     2     0
3     2     3     0
4     2     4     7
5     2     5     9
6     3     6     0

或使用base R-类似的方法是使用rle创建‘GRP’,然后使用ave将上一个与当前值相加(通过删除第一个和最后一个值),然后在开头追加0

grp <- with(rle(df$a), rep(seq_along(values), lengths))
df$c <- with(df, ave(b, grp, FUN = function(x) c(0, x[-1] + x[-length(x)])))

这篇关于如果当前行和前一行满足某些条件,如何在R数据框中添加新列,以显示当前行和前一行的值之和?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆