首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在分组的非连续行中找到差异?

如何在分组的非连续行中找到差异?
EN

Stack Overflow用户
提问于 2018-06-20 02:39:32
回答 2查看 421关注 0票数 2

我有一份有几千张记录的数据。我的数据看起来是这样的:

代码语言:javascript
运行
复制
Row     ID     OBS      Dist_cover
1       2       1           60
2       2       0          140
3       2       0           15
4       2       0          147
5       2       0           37
6       2       0           89
7       3       1          239
8       3       0           62
9       3       0           11
10      3       0          193

我需要在"1“和"0”值之间的Dist_cover中找到OBS差值.但按id分类。本质上,我在寻找1,4-2,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4有什么想法吗?

EN

回答 2

Stack Overflow用户

发布于 2018-06-20 02:54:07

您想要的可以用ave完成,按ID分组Dist_cover

请注意,虽然这个问题说明应该按OBS进行分组,但实际上并不需要这样做。等于1的OBS总是第一个,就像问题中(隐式)指出的那样。“任择议定书”要求“1,4 - 2,4,4,4,4,4,4,4,4,4,4等的差额”。

代码语言:javascript
运行
复制
ave(dat$Dist_cover, dat$ID, FUN = function(x) x - x[1])
#[1]    0   80  -45   87  -23   29    0 -177 -228  -46

数据.

代码语言:javascript
运行
复制
dat <-
structure(list(Row = 1:10, ID = c(2L, 2L, 2L, 2L, 2L, 2L, 3L, 
3L, 3L, 3L), OBS = c(1L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L), 
Dist_cover = c(60L, 140L, 15L, 147L, 37L, 89L, 239L, 62L, 
11L, 193L)), .Names = c("Row", "ID", "OBS", "Dist_cover"), class = "data.frame", row.names = c(NA, 
-10L))
票数 4
EN

Stack Overflow用户

发布于 2018-06-20 03:05:38

按'ID‘分组后,子集'Dist_cover’其中'OBS‘为1(假设每个ID只有一个实例1),从’Dist_ filter‘中减去它,并filter 'OBS’值为0。

代码语言:javascript
运行
复制
library(dplyr)
df1 %>% 
  group_by(ID) %>%
  mutate(Diff = Dist_cover[OBS==1] - Dist_cover) %>% 
  # if OBS is 1 occurs always as the first observation for ID
  # mutate(Diff = first(Dist_cover) - Dist_cover) %>% 
  filter(OBS == 0)

数据

代码语言:javascript
运行
复制
df1 <- structure(list(Row = 1:10, ID = c(2L, 2L, 2L, 2L, 2L, 2L, 3L, 
3L, 3L, 3L), OBS = c(1L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L), 
    Dist_cover = c(60L, 140L, 15L, 147L, 37L, 89L, 239L, 62L, 
    11L, 193L)), .Names = c("Row", "ID", "OBS", "Dist_cover"),
  class = "data.frame", row.names = c(NA, 
-10L))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50939428

复制
相关文章

相似问题

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