R:删除 Yield 列中 NA 大于 3 的县,并对 NA 小于 3 的县使用 na.spline
R: Remove Counties with >3 NA's in Yield column , and use na.spline for counties with < 3 NA's
我有一个包含 5 列的 data.frame "df":"year"、"state"、"county"、"fips"(州县标识符), "yield".
许多县的产量为 NA
。我最初通过代码消除了具有任何 NA
值的县:
Data <- df %>% group_by(fips) %>% filter(!any(is.na(Yield)))
我现在只需要消除那些包含 3 个以上 NA 的县。因此,NA>3
对于 NA
=< 3 的县,我使用 spline
函数:
v <- na.spline(df$Yield)
df$Yield <- v
到目前为止,我有以下内容用于删除所有 NA
>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)))
}
这显然是行不通的。任何见解将不胜感激。
使用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)
我有一个包含 5 列的 data.frame "df":"year"、"state"、"county"、"fips"(州县标识符), "yield".
许多县的产量为 NA
。我最初通过代码消除了具有任何 NA
值的县:
Data <- df %>% group_by(fips) %>% filter(!any(is.na(Yield)))
我现在只需要消除那些包含 3 个以上 NA 的县。因此,NA>3
对于 NA
=< 3 的县,我使用 spline
函数:
v <- na.spline(df$Yield)
df$Yield <- v
到目前为止,我有以下内容用于删除所有 NA
>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)))
}
这显然是行不通的。任何见解将不胜感激。
使用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)