2013-04-30 87 views
0

我对R完全陌生,我一直试图用每个列的平均值替换NA值。我尝试了很多选择。但似乎没有工作。我试过这个和许多类似的,但我继续得到:argument is not numeric or logical: returning NA用列表的平均值替换列表中的所有NA号码

script<-function() { 
for (i in names(data)) { 
     data[[i]][is.na(data[[i]])] <- mean(data[[i]], na.rm=TRUE); 
    } 
} 

过了一会我觉得还是算列和与此上来后:

script<-function() { 
    for (i in 1:20) { 
     data[[i]][is.na(data[[i]])] <- mean(data[[i]], na.rm=TRUE); 
    } 
} 

不显示任何错误,但似乎并没有任何工作。当我输入数据时,它只是相同的数据框,但未经编辑。任何人都可以帮助我吗?

+1

你的代码是正确的(虽然我不知道它为什么包裹在一个函数中);也许问题出在你的数据上。 'str(data)'的输出是什么? – Aaron 2013-04-30 02:01:11

+0

你可以发布示例'数据'? – Nishanth 2013-04-30 02:01:21

+0

@Aaron请注意,他们的代码实际上是封装在一个函数中,但它们没有正确缩进。 – Dason 2013-04-30 02:01:34

回答

5

与功能的问题是,它是一个函数,并由此作用域仅在运行如你所愿

for (i in names(data)) { 
     data[[i]][is.na(data[[i]])] <- mean(data[[i]], na.rm=TRUE); 
      } 
     } 

不是一个函数内将工作中的作用

的范围内更新data

另一种方法是通过使用lapply

传递 data作为参数

imputeMean <-function(data) { 

    for (i in names(data)) { 
    data[[i]][is.na(data[[i]])] <- mean(data[[i]], na.rm=TRUE); 
     } 
    return(data) 
    } 
# then you can save the result as a new object 

updatedData <- imputeMean(data) 

注意,对于命名列表(如data是),[[<-每次都会拷贝,所以你可以解决这个问题

updatedData <- lapply(data, function(x) replace(x, is.na(x), mean(x, na.rm = TRUE))) 
+0

您忘记添加一行'data'或者重试(数据),以避免除了最后一次评估结果之外的函数不会重试其他任何事情。 – 2013-04-30 02:42:37

+0

@Dwin确实和固定 – mnel 2013-04-30 03:07:36

+0

谢谢,我只是把它拿出来的功能,它工作正常 – user2334207 2013-04-30 18:40:03

0

随意制作一个功能(更新根据更正更正):

data.frame(lapply(data, function(x){replace(x, is.na(x), mean(x,na.rm=T))})) 
+2

不要在data.frames上使用'apply'。这会强制转换为矩阵,因此记忆效率不高,并会将所有列强制转换为相同类型。 'lapply'是要走的路。 – mnel 2013-04-30 04:00:52