我正在使用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。 我该如何使它失效保护?我的真实数据集具有“不完美”数据。 非常感谢我的帮助,因为我真的很困。
答案 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))))
)
}