R 当存在';s NA';s
我的纵向数据结构(在R中)如下所示: 我知道我可以使用R 当存在';s NA';s,r,missing-data,R,Missing Data,我的纵向数据结构(在R中)如下所示: 我知道我可以使用complete.cases()使其运行,但无法将其插入原始数据帧,因为行长度会有所不同 是否有人能解决我在前几年或后几年遇到的NA问题,或者有更好的解决方案解决我的困难尝试?如果只有NAs,请返回NA,如果只有一个非NA,则使用NA.aggregate将每个NA替换为单个非NA;如果一个县中有多个NA,则使用NA.approx library(zoo) na_approx <- function(x) { if (all(i
complete.cases()
使其运行,但无法将其插入原始数据帧,因为行长度会有所不同
是否有人能解决我在前几年或后几年遇到的
NA问题,或者有更好的解决方案解决我的困难尝试?如果只有NAs,请返回NA,如果只有一个非NA,则使用NA.aggregate
将每个NA替换为单个非NA;如果一个县中有多个NA,则使用NA.approx
library(zoo)
na_approx <- function(x) {
if (all(is.na(x))) NA
else if (sum(!is.na(x)) == 1) na.aggregate(x)
else na.approx(x, na.rm = FALSE)
}
transform(dat2, count = ave(count, county, FUN = na_approx))
这里有一个可以有稍微不同的行为的替代方案,尽管在本例中它给出了相同的结果
na_approx2 <- function(x) {
if (sum(!is.na(x)) > 1) na.approx(x, na.rm = FALSE)
else na.locf(x, na.rm = FALSE)
}
transform(dat2, count = ave(count, county, FUN = na_approx2))
na_approx2 1)na.近似值(x,na.rm=FALSE)
else na.locf(x,na.rm=FALSE)
}
转换(dat2,count=ave(count,count,count,FUN=na_approx2))
如果只有NA,则返回NA。如果只有一个非NA,则使用NA将每个NA替换为单个非NA。如果一个县中有多个NA,则使用NA。近似值
library(zoo)
na_approx <- function(x) {
if (all(is.na(x))) NA
else if (sum(!is.na(x)) == 1) na.aggregate(x)
else na.approx(x, na.rm = FALSE)
}
transform(dat2, count = ave(count, county, FUN = na_approx))
这里有一个可以有稍微不同的行为的替代方案,尽管在本例中它给出了相同的结果
na_approx2 <- function(x) {
if (sum(!is.na(x)) > 1) na.approx(x, na.rm = FALSE)
else na.locf(x, na.rm = FALSE)
}
transform(dat2, count = ave(count, county, FUN = na_approx2))
na_approx2 1)na.近似值(x,na.rm=FALSE)
else na.locf(x,na.rm=FALSE)
}
转换(dat2,count=ave(count,count,count,FUN=na_approx2))
@RichardScriven,谢谢你的建议,我已经包含了想要的结果。@RichardScriven,谢谢你的建议,我已经包含了期望的结果。我注意到,2003年县的计数值为10,而dat2的值应该是NA
。如果县中有一个非NA,则所有NAs都将被替换为它。如果您想要不同的东西,那么用您想要的任何东西替换na.aggregate(…)。例如,如果您只想填写非na后面的NAs,您可以使用na.locf(x,na.rm=FALSE)
。如果您不介意的话,请您解释一下,当我试图将您的if(cond){exp1}else{exp2}
放入ifelse(test=cond,yes=exp1,no=exp2)
中时,它不起作用,即ifelse(test=sum(!is.na(x))>1,yes=na.approx(x,na.rm=FALSE),no=na.locf(x,na.rm=FALSE)
如果……else未矢量化,但ifelse已矢量化。请使用na.approx(x,rule=2)
。请参见?approx
(其中na.approx
调用)对于规则
参数的定义,我注意到县
2003年
c的计数
值是10,而dat2的值应该是NA
。如果县中有一个非NA,那么所有的NA都会被替换。如果您想要不同的值,那么替换NA.aggregate(…)例如,如果您只想填写非na后面的NAs,您可以使用na.locf(x,na.rm=FALSE)
。如果您不介意的话,请您解释一下为什么我试图将您的if(cond){exp1}else{exp2}
放入ifelse(test=cond,yes=exp1,no=exp2)中
它不起作用,即ifelse(test=sum(!is.na(x))>1,yes=na.approx(x,na.rm=FALSE),no=na.locf(x,na.rm=FALSE)
如果…else没有矢量化,但ifelse是。使用na.approx(x,rule=2)
。有关规则
参数的定义,请参见?approx
。
county year count
1 a 2001 2
2 a 2002 4
3 a 2003 6
4 b 2001 4
5 b 2002 6
6 b 2003 8
7 c 2001 10
8 c 2002 10
9 c 2003 10
na_approx2 <- function(x) {
if (sum(!is.na(x)) > 1) na.approx(x, na.rm = FALSE)
else na.locf(x, na.rm = FALSE)
}
transform(dat2, count = ave(count, county, FUN = na_approx2))