我有一个数据框,其中包含缺失值的数据列,我想通过使用上下单元格的值来取代缺失值。
Y - X = Target
但是,我收到此错误
df1<-c(2,2,NA,10, 20, NA,3)
if(df1[i]== NA){
df1[i]= mean(df1[i+1],df1[i-1])
}
任何指导都将不胜感激以解决此问题。
答案 0 :(得分:3)
如果您确定没有任何连续的NA值且第一个和最后一个元素永远不是NA,那么您可以
df1<-c(2,2,NA,10, 20, NA,3)
idx<-which(is.na(df1))
df1[idx] <- (df1[idx-1] + df1[idx+1])/2
df1
# [1] 2.0 2.0 6.0 10.0 20.0 11.5 3.0
这应该比循环更有效。
答案 1 :(得分:2)
使用dplyr
中的滞后和潜在客户:
library(dplyr)
df1[is.na(df1)] <- (df1[is.na(lag(df1, default=""))] +
df1[is.na(lead(df1, default=""))]) / 2
这比for循环版
要快得多答案 2 :(得分:2)
您可以使用na.approx()
包中的zoo
将NA
替换为插值:
library(zoo)
> na.approx(df1)
# [1] 2.0 2.0 6.0 10.0 20.0 11.5 3.0
正如@ G.Grothendieck所提到的,如果连续多个NA
,这将填充NA
s。此外,如果末尾可以有NA
个,那么添加参数na.rm = FALSE
将保留它们,或者添加rule = 2
将使用第一个或最后一个非NA
替换它们。 / p>
答案 3 :(得分:1)
检查NAs使用is.na()
,制作一个循环并给mean()
一个向量作为参数,否则它只会看到第一个值。如果您没有连续的NA并且第一个和最后一个条目是非NA,那么这应该有效:
df1<-c(2,2,NA,10, 20, NA,3)
for(i in 2:(length(df1)-1)){
if(is.na(df1[i])){
df1[i]= mean(c(df1[i+1],df1[i-1]))
}
}
答案 4 :(得分:0)
首先检查相应列中的NA,如果缺少值,将其替换为列的平均值,否则仅返回数据集。
df $ col_name <-ifelse(is.na(df $ col_name),ave(df $ col_name, Fun = function(x)mean(x,na.rm == TRUE)),df $ col_name)