R:在Yield列中删除具有> 3 NA的县,并使用na.spline用于< 3 NA' s

时间:2015-07-06 07:10:41

标签: r if-statement na spline subset

我有一个data.frame" df"有5列:"年","州","县"," fips" (州 - 县标识符),"产量"。

许多县的收益率都包含NA。我最初通过代码消除了任何NA值的县:

Data <- df %>% group_by(fips) %>% filter(!any(is.na(Yield)))

我现在只需要消除那些包含超过3个NA的县。因此,NA> 3

对于那些NA =&lt; 3,我使用spline函数:

v <- na.spline(df$Yield)
df$Yield <- v

到目前为止,我有以下内容删除所有县NA&gt; 3并使用样条线填充剩余郡的NA

if(length(df$Yield[is.na(df$Yield))<3){
na.spline(df$Yield)
}
}else{
df %>% group_by(fips) %>% filter(!any(is.na(Yield)))
}

这显然不起作用。任何见解将不胜感激。

1 个答案:

答案 0 :(得分:1)

使用dplyr

library(dplyr)
library(zoo) 
df %>% 
   group_by(fips) %>%
   filter(sum(is.na(Yield))<3) %>% 
   mutate(Yield=na.spline(Yield))

使用data.table

library(data.table)#v1.9.5+
setDT(df)[, .SD[sum(is.na(Yield))<=3] , fips][,Yield:= na.spline(Yield) ,fips][]

或使用base R

transform(subset(df, ave(is.na(Yield), fips, FUN=sum)<3), Yield=na.spline(Yield))

数据

set.seed(29)
df <- data.frame(fips= sample(LETTERS[1:4], 30, replace=TRUE), 
     Yield= as.numeric(sample(c(NA,0:3), 30, replace=TRUE)), 
         stringsAsFactors=FALSE)