使用df本身填充R数据帧中的缺失值

时间:2017-06-10 13:13:13

标签: r dataframe machine-learning missing-data

以下是我的样本数据集 -

enter image description here

我必须根据item_id和Item_type相同的其他行的权重填写项目权重。例如,第三次观察的Item_wt必须是“5.6”。 你能否建议一种方法来填补R中的缺失值?我尝试了很多技术,却无法得到我想要的东西。 谢谢。

4 个答案:

答案 0 :(得分:2)

使用ave函数的基础R解决方案:

DF <- data.frame(Item_ID=c('T001','T002','T001','T004','T002'),
                 Item_wt=c(5.6,9.2,NA,3.9,NA),
                 Item_Type=c('Dairy','Snacks','Dairy','Drinks','Snacks'))

g <- ave(1:nrow(DF),DF$Item_ID,DF$Item_Type,FUN=function(i)mean(DF$Item_wt[i],na.rm=TRUE))
DF$Item_wt[is.na(DF$Item_wt)] <- g[is.na(DF$Item_wt)]

> DF
  Item_ID Item_wt Item_Type
1    T001     5.6     Dairy
2    T002     9.2    Snacks
3    T001     5.6     Dairy
4    T004     3.9    Drinks
5    T002     9.2    Snacks

答案 1 :(得分:1)

假设NULLNA,在按&#39; item_ID&#39;,&#39; item_Type&#39;进行分组后,获取第一个非NA&#39; item_wt&# 39;

library(dplyr)
df1 %>%
    group_by(item_ID, item_Type) %>%
    mutate(item_wt = item_wt[!is.na(item_wt)][1])
# A tibble: 5 x 3
# Groups:   item_ID, item_Type [3]
#  item_ID item_wt item_Type
#    <chr>   <dbl>     <chr>
#1    T001     5.6     Dairy
#2    T002     9.2    Snacks
#3    T001     5.6     Dairy
#4    T004     3.9    Drinks
#5    T002     9.2    Snacks

data.table

library(data.table)
setDT(df1)[, item_wt := item_wt[!is.na(item_wt)][1], .(item_ID, item_Type)]

数据

df1 <- data.frame(item_ID = c('T001', 'T002', 'T001', 'T004', 'T002'),
     item_wt = c(5.6, 9.2, NA, 3.9, NA),
     item_Type = c("Dairy", "Snacks", "Dairy", "Drinks", "Snacks"),
     stringsAsFactors=FALSE)

答案 2 :(得分:0)

使用来自dplyr的group_by和来自tidyr的fill

library(tidyverse)

 Filled_Item_Wts <- df1 %>%
 group_by(Item_ID, Item_Type) %>%
 fill(Item_wt)



Item_ID Item_wt Item_Type
    <chr>   <dbl>     <chr>
1    T001     5.6     Dairy
2    T001     5.6     Dairy
3    T002     9.2    Snacks
4    T002     9.2    Snacks
5    T004     3.9    Drinks

答案 3 :(得分:0)

为了在R工具中插入缺失数据,最好的软件包是Missforest,mouse,Roughset。 Roughset包适用于医疗数据集。对于分类数据集,我们可以使用missforest包来获得最佳结果。