在具有lag和cummax的mutate中添加na.omit()会导致“错误:列的长度必须为x(组大小)或一个,而不是0”

时间:2019-11-13 20:04:44

标签: r dplyr

我正在使用dplyr对数据框中的列进行突变。它包括创建当前行值与到目前为止的最大值的比率(基本上是滞后和cummax组合)。 效果很好。除非有NA值,否则以下所有计算均变为NA。

我尝试在此处和此处放置na.omit(),但是虽然可行,但函数失败了,因为na.omit()干扰了向量的长度,并且崩溃了。

这是我的可复制代码:

v1<-c(NA,100,80,40,NA,30,100,40,20,10,NA,NA,1,NA)
v2<-c(100,100,90,50,NA,-40,NA,-10,NA,NA,NA,1,NA,NA)
group<-c(1,1,1,1,1,1,2,2,2,2,2,3,3,4)

x1<-as.data.frame(cbind(v1,v2,group))


library(dplyr)
for ( i in c("v1","v2")){ 

  x1<-x1 %>% 
    group_by(group) %>%
    mutate( !!sym(paste( i,"_max_lag_ratio", sep="")) :=  get(i)/ lag( as.vector(cummax( get(i)))  , default=first(get(i))))


}

如果我添加na.omit()如下:

mutate( !!sym(paste( i,"_max_lag_ratio", sep="")) := get(i)/ lag( cummax( na.omit(get(i)))  , default=first( get(i)  )))

我收到以下错误:

Error: Column `column_max_lag_ratio` must be length 1 (the group size), not 0

最可能是因为一个单独的组(第4组)仅具有NA。 我该如何使它失效保护?我的真实数据集具有“不完美”数据。 非常感谢我的帮助,因为我真的很困。

2 个答案:

答案 0 :(得分:0)

基于此答案Need to get R cummax but dealing properly with NAs的可行解决方案可能是:

 df %>% 
    replace_na(list(v1=-Inf, v2=-Inf)) %>% 
    group_by(group) %>% 
    mutate(max_v1 = cummax(v1), 
                 max_v2 = cummax(v2)
                 ) %>% 
    group_by(group) %>% 
    mutate(v1_max_lag_ratio = v1/lag(max_v1)) %>% 
    mutate(v2_max_lag_ratio = v2/lag(max_v2))

答案 1 :(得分:0)

进行此变通方法并达到目的。

v1<-c(NA,100,80,40,NA,30,100,40,20,10,NA,NA,1,NA)
v2<-c(100,100,90,50,NA,-40,NA,-10,NA,NA,NA,1,NA,NA)
group<-c(1,1,1,1,1,1,2,2,2,2,2,3,3,4)

x1<-as.data.frame(cbind(v1,v2,group))


library(dplyr)
for ( i in c("v1","v2")){ 

  x1<-x1 %>% 
    group_by(group) %>%
    mutate( !!sym(paste( i,"_max_lag_ratio", sep="")) :=  get(i)/(lag( cummax( ifelse(is.na(get(i)), na.omit(get(i) ) ,get(i)))  , default=first(get(i))))
    )  

}