首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用dplyr逐组计算每个块?

使用dplyr逐组计算每个块?
EN

Stack Overflow用户
提问于 2015-01-31 02:14:52
回答 3查看 658关注 0票数 0

如何使用dplyr包获得预期的计算?

代码语言:javascript
复制
row value   group   expected
1   2       1       =NA
2   4       1       =4-2
3   5       1       =5-4
4   6       2       =NA
5   11      2       =11-6
6   12      1       =NA
7   15      1       =15-12

我试过了

代码语言:javascript
复制
df=read.table(header=1, text='    row    value  group
1   2   1
2   4   1
3   5   1
4   6   2
5   11  2
6   12  1
7   15  1')

df %>% group_by(group) %>% mutate(expected=value-lag(value))

如何计算每个块(第1-3、4-5、6-7行),尽管第1-3行和第6-7行标记为相同的组号?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-01-31 02:36:50

下面是一个类似的方法。我使用cumsum创建了一个新的组变量。当group中的两个数字之间的差值不是0时,R就会分配一个新的组号。如果您有更多的数据,这种方法可能会有帮助。

代码语言:javascript
复制
library(dplyr)

mutate(df, foo = cumsum(c(T, diff(group) != 0))) %>%
group_by(foo) %>%
mutate(out = value - lag(value))

#  row value group foo out
#1   1     2     1   1  NA
#2   2     4     1   1   2
#3   3     5     1   1   1
#4   4     6     2   2  NA
#5   5    11     2   2   5
#6   6    12     1   3  NA
#7   7    15     1   3   3
票数 3
EN

Stack Overflow用户

发布于 2015-01-31 02:23:52

由于您的group变量对此没有用处,所以创建一个新变量aux并将其用作分组变量:

代码语言:javascript
复制
library(dplyr)
df$aux <- rep(seq_along(rle(df$group)$values), times = rle(df$group)$lengths)

df %>% group_by(aux) %>% mutate(expected = value - lag(value))

Source: local data frame [7 x 5]
Groups: aux

  row value group aux expected
1   1     2     1   1       NA
2   2     4     1   1        2
3   3     5     1   1        1
4   4     6     2   2       NA
5   5    11     2   2        5
6   6    12     1   3       NA
7   7    15     1   3        3
票数 3
EN

Stack Overflow用户

发布于 2015-01-31 04:36:19

下面是使用1.9.5的一个选项。devel版本引入了新的函数rleidshift (默认的type是“type”,fill是"NA"),它们对此很有用。

代码语言:javascript
复制
library(data.table)
setDT(df)[, expected:=value-shift(value) ,by = rleid(group)][]
#     row value group expected
#1:   1     2     1       NA
#2:   2     4     1        2
#3:   3     5     1        1
#4:   4     6     2       NA
#5:   5    11     2        5
#6:   6    12     1       NA
#7:   7    15     1        3
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28247456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档