Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.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 当存在';s NA';s_R_Missing Data - Fatal编程技术网

R 当存在';s NA';s

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

我的纵向数据结构(在R中)如下所示:

我知道我可以使用
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))