我想根据R中的另一个数据框进行数据插补

时间:2017-12-24 05:32:33

标签: r

enter image description here

这是我的数据集,我创建了另一个数据集,它具有与Item_Fat_Content,Item_Type组合相似的意思 enter image description here

我想根据这些平均值(例如

)在我的数据集中的Item_Weight中输入缺失值

aggregate(Dataset$Item_Weight~Dataset$Item_Fat_Content+Dataset$Item_Type,Dataset$Item_Fat_Content, mean ,na.action = na.omit)

我无法在原始数据集中相应地输入这些平均值,而Item_Weight值缺失。

1 个答案:

答案 0 :(得分:2)

使用一些假数据:

x <- mtcars
rownames(x) <- NULL

稍后使用merge会导致对行进行重新排序。为了解决这个问题(至少对于这个例子),我添加了一个i变量来跟踪订单。这可能不是您使用所必需的,并且/或者您已经在数据中轻松订购了某些内容。

x$i <- seq_len(nrow(x))

创建一些缺失值:

x$mpg[c(1,3,5)] <- NA
head(x, n=10)
#     mpg cyl  disp  hp drat    wt  qsec vs am gear carb  i
# 1    NA   6 160.0 110 3.90 2.620 16.46  0  1    4    4  1
# 2  21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4  2
# 3    NA   4 108.0  93 3.85 2.320 18.61  1  1    4    1  3
# 4  21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1  4
# 5    NA   8 360.0 175 3.15 3.440 17.02  0  0    3    2  5
# 6  18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1  6
# 7  14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4  7
# 8  24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2  8
# 9  22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2  9
# 10 19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4 10

让我们创建一些分类平均值,以便我们可以将它们合并。na.rm=TRUE传递给FUN函数(mean)。

avgs <- aggregate(mpg ~ cyl + am, mean, na.rm = TRUE, data = x)
# the column name is the same, but we need it to be different for the merge
colnames(avgs)[3] <- "newmpg"
avgs
#   cyl am   newmpg
# 1   4  0 22.90000
# 2   6  0 19.12500
# 3   8  0 14.71818
# 4   4  1 28.82857
# 5   6  1 20.35000
# 6   8  1 15.40000

现在是合并的归责:

newx <- merge(avgs, x, by = c("cyl", "am"), all.y = TRUE, sort = FALSE)

现在,我们选择直接NA的两列中的第一个非ifelse

newx$mpg <- ifelse(is.na(newx$mpg), newx$newmpg, newx$mpg)

清理不再需要的列$newmpg后,我们会恢复之前的订单。

newx$newmpg <- NULL
newx <- newx[order(newx$i),]
head( newx, n=10 )
#    cyl am      mpg  disp  hp drat    wt  qsec vs gear carb  i
# 28   6  1 20.35000 160.0 110 3.90 2.620 16.46  0    4    4  1
# 29   6  1 21.00000 160.0 110 3.90 2.875 17.02  0    4    4  2
# 21   4  1 28.82857 108.0  93 3.85 2.320 18.61  1    4    1  3
# 7    6  0 21.40000 258.0 110 3.08 3.215 19.44  1    3    1  4
# 9    8  0 14.71818 360.0 175 3.15 3.440 17.02  0    3    2  5
# 4    6  0 18.10000 225.0 105 2.76 3.460 20.22  1    3    1  6
# 8    8  0 14.30000 360.0 245 3.21 3.570 15.84  0    3    4  7
# 2    4  0 24.40000 146.7  62 3.69 3.190 20.00  1    4    2  8
# 1    4  0 22.80000 140.8  95 3.92 3.150 22.90  1    4    2  9
# 6    6  0 19.20000 167.6 123 3.92 3.440 18.30  1    4    4 10