首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在data.frame中查找组间的时间差

在data.frame中查找组间的时间差
EN

Stack Overflow用户
提问于 2019-04-13 08:17:53
回答 2查看 38关注 0票数 1

让我们假设我想估计data.frame中两个组之间的时间差。

这里是我的数据的一个例子:

代码语言:javascript
运行
复制
df_1 = data.frame(time = c(1,3,5,6,8,11,15,16,18,20), group = 'a') # create group 'a' data
df_2 = data.frame(time = c(2,7,10,13,19,25), group = 'b') # create group 'b' data

df = rbind(df_1, df_2) # merge groups

df = df[with(df, order(time)), ] # order by time
rownames(df) = NULL #remove row names

> df
   time group
1     1     a
2     2     b
3     3     a
4     5     a
5     6     a
6     7     b
7     8     a
8    10     b
9    11     a
10   13     b
11   15     a
12   16     a
13   18     a
14   19     b
15   20     a
16   25     b

现在我需要将time观察从b组减去a组的time观察。即2-1,7-6,10-8,13-11,19-18和25-20.

代码语言:javascript
运行
复制
# Expected output
> out
[1] 1 1 2 2 1 5

我怎样才能做到这一点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-13 08:25:24

我们可以找到b的指数,并从它以前的索引中减去time值。

代码语言:javascript
运行
复制
inds <- which(df$group == "b")
df$time[inds] - df$time[inds - 1]
#[1] 1 1 2 2 1 5
票数 1
EN

Stack Overflow用户

发布于 2019-04-13 19:21:33

这里有一个tidyverse解决方案。首先,根据b组的外观的基本逻辑添加一列( transmute ),并减去前一列。然后filter只得到结果,然后用deframe转换成向量

代码语言:javascript
运行
复制
library(tidyverse)

df %>%
  transmute(result = if_else(group == "b", time - lag(time), 0)) %>% 
  filter(result != 0) %>%
  deframe()

结果:

代码语言:javascript
运行
复制
[1] 1 1 2 2 1 5
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55663432

复制
相关文章

相似问题

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