以下是我的样本数据集 -
我必须根据item_id和Item_type相同的其他行的权重填写项目权重。例如,第三次观察的Item_wt必须是“5.6”。 你能否建议一种方法来填补R中的缺失值?我尝试了很多技术,却无法得到我想要的东西。 谢谢。
答案 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)
假设NULL
为NA
,在按&#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包来获得最佳结果。