首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >上一次观察以值和列为条件结转

上一次观察以值和列为条件结转
EN

Stack Overflow用户
提问于 2019-11-27 02:25:36
回答 2查看 181关注 0票数 0

我有一个纵向数据帧,其中有很多缺失值,如下所示。

代码语言:javascript
复制
ID = c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3)
date = c(1,2,3,4,5,1,2,3,4,5,1,2,3,4,5)
cond = c(0,0,0,1,0,0,0,0,1,0,0,0,0,0,0)
var = c(1, NA , 2, 0,NA, NA, 3, NA,0, NA, 2, NA, 1,NA,NA)
df = data.frame(ID, date, cond,var)

我想根据两个条件来推广最后的观察结果:

1)在cond=0时,应对感兴趣变量的高值进行观察。

2)在cond=1时,应将感兴趣变量的较低值向前推进。

有没有人知道我该如何以优雅的方式做到这一点?

最终数据集应如下所示

代码语言:javascript
复制
ID = c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3)
date = c(1,2,3,4,5,1,2,3,4,5,1,2,3,4,5)
cond = c(0,0,0,1,0,0,0,0,1,0,0,0,0,0,0)
var = c(1, 1 , 2, 0, 0, NA, 3, 3, 0, 0,2,2,2,2,2)
final = data.frame(ID, date, cond,var)

到目前为止,我能够推广最后的观察结果,但我不能强加条件。

代码语言:javascript
复制
library(zoo)
df <- df %>%
  group_by(ID) %>% 
  mutate(var = 
           na.locf(var, na.rm = F))

欢迎提出任何建议。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-27 02:53:48

这是accumulate2 ie的用法

代码语言:javascript
复制
df%>%
   group_by(ID)%>%
   mutate(d = unlist(accumulate2(var,cond[-1],function(z,x,y) if(y) min(z,x,na.rm=TRUE) else max(z,x,na.rm=TRUE))))
# A tibble: 15 x 5
# Groups:   ID [3]
      ID  date  cond   var     d
   <dbl> <dbl> <dbl> <dbl> <dbl>
 1     1     1     0     1     1
 2     1     2     0    NA     1
 3     1     3     0     2     2
 4     1     4     1     0     0
 5     1     5     0    NA     0
 6     2     1     0    NA    NA
 7     2     2     0     3     3
 8     2     3     0    NA     3
 9     2     4     1     0     0
10     2     5     0    NA     0
11     3     1     0     2     2
12     3     2     0    NA     2
13     3     3     0     1     2
14     3     4     0    NA     2
15     3     5     0    NA     2
票数 2
EN

Stack Overflow用户

发布于 2019-11-27 02:55:48

我想,如果我明白你在找什么的话?

代码语言:javascript
复制
ID = c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3)
date = c(1,2,3,4,5,1,2,3,4,5,1,2,3,4,5)
cond = c(0,0,0,1,0,0,0,0,1,0,0,0,0,0,0)
var = c(1, NA , 2, 0,NA, NA, 3, NA,0, NA, 2, NA, 1,NA,NA)
df = data.frame(ID, date, cond,var)

使用case_when,您可以执行一些条件检查。我不确定您是否要返回所有"ID“字段的最小值,但这将查看条件,然后滞后或领先以找到一个非缺失值

代码语言:javascript
复制
library(dplyr)
df %>% 
  mutate(var_imput = case_when(
    cond == 0 & is.na(var)~lag(x = var, n = 1, default = NA),
    cond == 1 & is.na(var)~lead(x = var, n = 1, default = NA),
    TRUE~var
  ))

这会产生:

代码语言:javascript
复制
   ID date cond var var_imput
1   1    1    0   1         1
2   1    2    0  NA         1
3   1    3    0   2         2
4   1    4    1   0         0
5   1    5    0  NA         0
6   2    1    0  NA        NA
7   2    2    0   3         3
8   2    3    0  NA         3
9   2    4    1   0         0
10  2    5    0  NA         0
11  3    1    0   2         2
12  3    2    0  NA         2
13  3    3    0   1         1
14  3    4    0  NA         1
15  3    5    0  NA        NA

如果您想要按ID分组,那么您可以按ID生成一个输入表,然后将其与原始表连接起来,如下所示:

代码语言:javascript
复制
# enerate input table
input_table <- df %>% 
  group_by(ID) %>% 
  summarise(min = min(var, na.rm = T),
            max = max(var, na.rm = T)) %>% 
  gather(cond, value, -ID) %>% 
  mutate(cond = ifelse(cond == "min", 0, 1))

# Join and impute missing
df %>% 
  left_join(input_table,by = c("ID", "cond")) %>% 
  mutate(var_imput = ifelse(is.na(var), value, var))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59057265

复制
相关文章

相似问题

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