Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 在带有lag和cummax的mutate中添加na.omit()会导致;错误:列的长度必须为x(组大小)或1,而不是0“;_R_Dplyr - Fatal编程技术网

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

R 在带有lag和cummax的mutate中添加na.omit()会导致;错误:列的长度必须为x(组大小)或1,而不是0“;,r,dplyr,R,Dplyr,我正在使用dplyr在我的数据帧中变异列。它包括创建当前行值与当前最大值的比率(基本上是滞后和最大值的组合)。 它工作得很好。除非有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,N

我正在使用dplyr在我的数据帧中变异列。它包括创建当前行值与当前最大值的比率(基本上是滞后和最大值的组合)。 它工作得很好。除非有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))))


}
我得到以下错误:

Error: Column `column_max_lag_ratio` must be length 1 (the group size), not 0
很可能是因为一个组(第4组)只有NAs。 我怎样才能保证这个安全?我的真实数据集以“不完美”数据为特征。
非常感谢您的帮助,因为我真的很累。

基于此答案的有效解决方案可能是:

df%>%
替换_na(列表(v1=-Inf,v2=-Inf))%>%
分组依据(分组)%>%
变异(max_v1=cummax(v1),
max_v2=cummax(v2)
) %>% 
分组依据(分组)%>%
变异(v1_最大滞后比率=v1/滞后(最大滞后v1))%>%
变异(v2_最大_滞后比=v2/滞后(max_v2))

解决了这个问题并成功了

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))))
    )  

}

v1我想出了一个可能的解决方案,但当我想出它时,
na
s的作用并不清楚。对于你的计算,na不应该存在,特别是在小组第一次观察时。为了计算所需的变量,您应该将它们排除在外,并以比率或差异有意义的方式对它们进行编码。找到了解决方法并已发布。谢谢顺便说一句,它返回
找不到函数“replace\u na”
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))))
    )  

}