我有一个包含各种数字,逻辑,日期等498个变量的数据集,我将其作为R中的数据框,其中包含观察行和变量列。我想用这个变量的平均值替换它们的缺失值。
我已将此非常简单的函数编码为均值插补:
impute.mean <- function(x) replace(x, is.na(x), mean(x, na.rm = TRUE))
如果我应用于单个变量say dataset $ variableA:
,这可以很好地工作dataset$variableA <- impute.mean(dataset$variableA)
这样做可以让我得到我想要的一个变量,但因为我有一个相当大的变量子集,我需要这样做,我不想手动这样做通过浏览每个需要插补的变量。
我的第一直觉是使用R中的一个应用函数来有效地执行此操作,但我似乎并不了解如何准确地执行此操作。
粗略的第一次尝试是使用标准申请:
newdataset <- apply(dataset, 2, impute.mean)
这显然有点粗糙,因为它试图将函数应用于所有列,包括非数字的变量,但它似乎是一个合理的起始位置,即使它可能会产生一些警告。唉,这种方法不起作用,我的所有变量都保持不变。
我还做了一些lapply,mapply,ddply的实验但到目前为止没有任何成功。
理想情况下,我希望能够做到这样的事情:
relevantVariables <- c("variableA1", "variableA2", ..., "variableA293")
newdataset <- magical.apply(dataset, relevantVariables, impute.mean)
是否有一些以这种方式运作的应用函数?
或者,还有其他一些有效的方法吗?
答案 0 :(得分:1)
您可以使用data.table包有效地执行此操作:
SetNAsToMean <- function(dt, vars) {
# Sets NA values of columns to the column means
#
# Args:
# dt: data.table object to work with
# vars: vector of column names to replace NAs
#
# Returns:
# Nothing. Alters data.table in place.
#
# Example:
# dt <- data.table(num1 = c(1, NA, 3),
# num2 = c(NA, NA, 4),
# char1 = rep("a", 3))
# SetNAsToMean(dt, c("num1", "num2"))
# # Alternatively, set all numeric columns
# numerics <- which(lapply(dt, class) == "numeric")
# SetNAsToMean(dt, numerics)
require(data.table)
for (var in vars) {
set(dt, which(is.na(dt[[var]])), var, mean(dt[[var]], na.rm=T))
}
}
答案 1 :(得分:0)
这会让你满意吗?
for (j in 1:length(dataset[1,]))
{
if (is.numeric(dataset[,j]))
{
for(k in 1:length(dataset[,1]))
{
if(is.na(dataset[k,j]))
{
dataset[k,j] <- mean(dataset[,j],na.rm=T)
}
}
}
}