Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.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 用列平均值替换缺少的值_R_Missing Data_Imputation - Fatal编程技术网

R 用列平均值替换缺少的值

R 用列平均值替换缺少的值,r,missing-data,imputation,R,Missing Data,Imputation,我不知道如何在每列上循环以将NA值替换为列平均值。当我尝试使用以下内容替换一个列时,效果很好 Column1[is.na(Column1)] <- round(mean(Column1, na.rm = TRUE)) Column1[is.na(Column1)]对代码进行相对简单的修改应该可以解决这个问题: for(i in 1:ncol(data)){ data[is.na(data[,i]), i] <- mean(data[,i], na.rm = TRUE) } f

我不知道如何在每列上循环以将NA值替换为列平均值。当我尝试使用以下内容替换一个列时,效果很好

Column1[is.na(Column1)] <- round(mean(Column1, na.rm = TRUE))

Column1[is.na(Column1)]对代码进行相对简单的修改应该可以解决这个问题:

for(i in 1:ncol(data)){
  data[is.na(data[,i]), i] <- mean(data[,i], na.rm = TRUE)
}
for(1中的i:ncol(数据)){
data[is.na(data[,i]),i]您也可以尝试:

 cM <- colMeans(d1, na.rm=TRUE)
 indx <- which(is.na(d1), arr.ind=TRUE)
 d1[indx] <- cM[indx[,2]]
 d1  

cM要使用@akrun的样本数据添加到备选方案中,我将执行以下操作:

d1[] <- lapply(d1, function(x) { 
  x[is.na(x)] <- mean(x, na.rm = TRUE)
  x
})
d1

d1[]如果
DF
是数字列的数据框:

library(zoo)
na.aggregate(DF)
增加:

仅使用R的基定义一个函数,该函数对一列执行此操作,然后对每列执行lappy操作:

NA2mean <- function(x) replace(x, is.na(x), mean(x, na.rm = TRUE))
replace(DF, TRUE, lapply(DF, NA2mean))

NA2mean
lappy
可以代替
用于
循环

d1[] <- lapply(d1, function(x) ifelse(is.na(x), mean(x, na.rm = TRUE), x))

d1[]类似于@Thomas指出的答案,
这也可以使用R的
ifelse()
方法完成:

for(i in 1:ncol(data)){
  data[,i]=ifelse(is.na(data[,i]),
                  ave(data[,i],FUN=function(y) mean(y, na.rm = TRUE)),
                  data[,i])
}
在哪里,,
ifelse(测试,是,否)
的参数有:-

测试-要检查的逻辑条件

是-如果条件为真,则执行

否-条件为False时的其他情况

ave(x,…,FUN=mean)
是R中用于计算x[]子集平均值的方法

#假设我有一个数据帧,df如下-
# Lets say I have a dataframe , df as following -
df <- data.frame(a=c(2,3,4,NA,5,NA),b=c(1,2,3,4,NA,NA))

# create a custom function
fillNAwithMean <- function(x){
    na_index <- which(is.na(x))        
    mean_x <- mean(x, na.rm=T)
    x[na_index] <- mean_x
    return(x)
}

(df <- apply(df,2,fillNAwithMean))
   a   b
2.0 1.0
3.0 2.0
4.0 3.0
3.5 4.0
5.0 2.5
3.5 2.5

df也有使用imputeTS包的快速解决方案:

library(imputeTS)
na_mean(yourDataFrame)

dplyr
mutate\u all
mutate\u at
在这里可能很有用:

library(dplyr)                                                             

set.seed(10)                                                               
df <- data.frame(a = sample(c(NA, 1:3)    , replace = TRUE, 10),           
                 b = sample(c(NA, 101:103), replace = TRUE, 10),                            
                 c = sample(c(NA, 201:203), replace = TRUE, 10))                            

df         

#>     a   b   c
#> 1   2 102 203
#> 2   1 102 202
#> 3   1  NA 203
#> 4   2 102 201
#> 5  NA 101 201
#> 6  NA 101 202
#> 7   1  NA 203
#> 8   1 101  NA
#> 9   2 101 203
#> 10  1 103 201

df %>% mutate_all(~ifelse(is.na(.x), mean(.x, na.rm = TRUE), .x))          

#>        a       b        c
#> 1  2.000 102.000 203.0000
#> 2  1.000 102.000 202.0000
#> 3  1.000 101.625 203.0000
#> 4  2.000 102.000 201.0000
#> 5  1.375 101.000 201.0000
#> 6  1.375 101.000 202.0000
#> 7  1.000 101.625 203.0000
#> 8  1.000 101.000 202.1111
#> 9  2.000 101.000 203.0000
#> 10 1.000 103.000 201.0000

df %>% mutate_at(vars(a, b),~ifelse(is.na(.x), mean(.x, na.rm = TRUE), .x))

#>        a       b   c
#> 1  2.000 102.000 203
#> 2  1.000 102.000 202
#> 3  1.000 101.625 203
#> 4  2.000 102.000 201
#> 5  1.375 101.000 201
#> 6  1.375 101.000 202
#> 7  1.000 101.625 203
#> 8  1.000 101.000  NA
#> 9  2.000 101.000 203
#> 10 1.000 103.000 201
库(dplyr)
种子(10)
DFA b c
#> 1   2 102 203
#> 2   1 102 202
#>3 1 NA 203
#> 4   2 102 201
#>5 NA 101 201
#>6 NA 101 202
#>7 1 NA 203
#>81101 NA
#> 9   2 101 203
#> 10  1 103 201
df%>%mutate_all(~ifelse(is.na(.x),mean(.x,na.rm=TRUE),.x))
#>a、b、c
#> 1  2.000 102.000 203.0000
#> 2  1.000 102.000 202.0000
#> 3  1.000 101.625 203.0000
#> 4  2.000 102.000 201.0000
#> 5  1.375 101.000 201.0000
#> 6  1.375 101.000 202.0000
#> 7  1.000 101.625 203.0000
#> 8  1.000 101.000 202.1111
#> 9  2.000 101.000 203.0000
#> 10 1.000 103.000 201.0000
df%>%mutate_at(vars(a,b),~ifelse(is.na(.x),mean(.x,na.rm=TRUE),.x))
#>a、b、c
#> 1  2.000 102.000 203
#> 2  1.000 102.000 202
#> 3  1.000 101.625 203
#> 4  2.000 102.000 201
#> 5  1.375 101.000 201
#> 6  1.375 101.000 202
#> 7  1.000 101.625 203
#>81.000 101.000 NA
#> 9  2.000 101.000 203
#> 10 1.000 103.000 201
使用is的单衬里

如果您的
df
包含非数字的列,则这比一行多花一点时间

mean_to_fill <- select_if(ungroup(df), is.numeric) %>%
 colMeans(na.rm=T)

bind_cols(select(df, group1, group2, group3),
          select_if(ungroup(df), is.numeric) %>% 
            tidyr::replace_na(as.list(mean_to_fill))
          ) 
平均填充百分比
colMeans(na.rm=T)
绑定列(选择(df、组1、组2、组3),
如果(解组(df)为.numeric),则选择\>%
tidyr::替换(如列表所示(平均填充))
) 

简单地使用Zoo,它将简单地用列值的平均值替换所有NA值:

library(zoo)
na.aggregate(data) 

使用data.table包,您可以使用
set()
函数并在列上循环,并使用您选择的聚合或值替换
NA
s或任何您喜欢的内容(此处:平均值):

require(data.table)
#资料
dt=复制(虹膜[,-5])
setDT(dt)
dt[1:4,萼片长度:=NA]#引入NAs
#将NAs替换为mean(或任何您喜欢的函数)
对于(j)和(名称(dt))){
set(dt,
i=这是.na(dt[[j]]),
j=j,
值=平均值(dt[[j]],na.rm=TRUE))
}

用列的平均值替换缺少的值是一种统计上的错误做法。@Bonded我这样做的原因可能是因为如果我忽略了那些NA值,我的数据集会缩小到一个非常小的数字。你能建议什么是处理此类问题的最佳方法吗?如果你能提供一些到博客的链接,如果你想用作为一种快速破解方法,您可以尝试替换NA,例如
平均值(x)+rnorm(长度(缺失(x))*sd(x)
。这将不考虑缺失之间的相关性(或测量数据的相关性),但至少不会严重夸大结果的重要性。最好是获得处理缺失值插补的软件包的经验。这个问题有很多微妙之处。@42-我意识到这个评论已经有几年了。但是,代码的字面意思是
mean(x)+rnorm(length(missing)吗(x) )*sd(x)
?当我运行它时,我在missing(x)中得到了
错误:“missing”的用法无效。
。我希望它的目的是取x的可用值的平均值,然后加上rnorm(NAs的长度)*sd(x的可用值)。对吗?我喜欢渎职行:-)。我个人正在寻找一个快速的破解方法,因为我正在使用'98 KDD cup数据集,该数据集具有120多个NAs属性。我想删除其中的大多数属性,并且说明仅排除>=.995 NA…更像是伪代码。可能需要适当的索引,但可能需要
rnorm(n=sum(is.NA(x)),mean=mean(x),sd=sd(x))
将更接近工作代码。非常感谢。我在处理数据中缺失的日期时遇到了另一个问题。我无法用上述方法替换日期。你能给我一些建议吗?你应该问这个问题then@A手推车和马海毛。这可能是因为我在编程方面的背景有限:公司做什么第三行中的luding
x
?稍微运行一下代码,我推断这里的要点是返回整个向量
x
,而不仅仅是替换值,然后覆盖整个df
d1
(按照开放括号
[/code>),而不是只覆盖
NA
s.@DanielFletcher,这就差不多了。奇怪的是,这没有更多的投票权或最佳答案选择。非常简洁的实现。谢谢。有趣的是,在lapply之后,我从dplyr发出的“聚集”命令不起作用。:(我在
library(imputeTS)
na_mean(yourDataFrame)
library(dplyr)                                                             

set.seed(10)                                                               
df <- data.frame(a = sample(c(NA, 1:3)    , replace = TRUE, 10),           
                 b = sample(c(NA, 101:103), replace = TRUE, 10),                            
                 c = sample(c(NA, 201:203), replace = TRUE, 10))                            

df         

#>     a   b   c
#> 1   2 102 203
#> 2   1 102 202
#> 3   1  NA 203
#> 4   2 102 201
#> 5  NA 101 201
#> 6  NA 101 202
#> 7   1  NA 203
#> 8   1 101  NA
#> 9   2 101 203
#> 10  1 103 201

df %>% mutate_all(~ifelse(is.na(.x), mean(.x, na.rm = TRUE), .x))          

#>        a       b        c
#> 1  2.000 102.000 203.0000
#> 2  1.000 102.000 202.0000
#> 3  1.000 101.625 203.0000
#> 4  2.000 102.000 201.0000
#> 5  1.375 101.000 201.0000
#> 6  1.375 101.000 202.0000
#> 7  1.000 101.625 203.0000
#> 8  1.000 101.000 202.1111
#> 9  2.000 101.000 203.0000
#> 10 1.000 103.000 201.0000

df %>% mutate_at(vars(a, b),~ifelse(is.na(.x), mean(.x, na.rm = TRUE), .x))

#>        a       b   c
#> 1  2.000 102.000 203
#> 2  1.000 102.000 202
#> 3  1.000 101.625 203
#> 4  2.000 102.000 201
#> 5  1.375 101.000 201
#> 6  1.375 101.000 202
#> 7  1.000 101.625 203
#> 8  1.000 101.000  NA
#> 9  2.000 101.000 203
#> 10 1.000 103.000 201
library(tidyr)
replace_na(mtcars,as.list(colMeans(mtcars,na.rm=T)))
mean_to_fill <- select_if(ungroup(df), is.numeric) %>%
 colMeans(na.rm=T)

bind_cols(select(df, group1, group2, group3),
          select_if(ungroup(df), is.numeric) %>% 
            tidyr::replace_na(as.list(mean_to_fill))
          ) 
library(zoo)
na.aggregate(data)