【问题标题】:Replace NA with Median Based on Multiple Conditions [duplicate]用基于多个条件的中值替换 NA [重复]
【发布时间】:2018-07-04 13:37:40
【问题描述】:

这是我的第一篇 Stack Overflow 帖子。我researchedextensively但没有找到类似的帖子。

我试图根据两个条件估算 NA 值的中位数。

这是我的代码:

#Create sample of original data for reproducibility
Date<-c("2009-05-01","2009-05-02","2009-05-03","2009-06-01","2009-06-02",
        "2009-06-03", "2010-05-01","2010-05-02","2010-05-03","2010-06-01",
        "2010-06-02","2010-06-03","2011-05-01","2011-05-02","2011-05-03",
        "2011-06-01","2011-06-02","2011-06-03")
Month<- c("May","May","May","June","June","June",
          "May","May","May","June","June","June",
          "May","May","May","June","June","June")
DayType<- c("Monday","Tuesday","Wednesday","Monday","Tuesday","Wednesday",
            "Monday","Tuesday","Wednesday","Monday","Tuesday","Wednesday",
            "Monday","Tuesday","Wednesday","Monday","Tuesday","Wednesday")
Qty<- c(NA,NA,NA,NA,NA,NA,
        1,2,1,10,15,13,
        3,2,5,20,14,16)

#Combine into dataframe
Example<-data.frame(Date,Month,DayType,Qty)

#Test output
Example

# Make a separate dataframe to calculate the median value based on day of the month
test1 <- ddply(Example,. (DayType,Month),summarize,median=median(Qty,na.rm=TRUE))

这按预期工作。 Test1 输出如下所示:

DayType   Month  Median
Monday    June   15.0
Monday    May    2.0
Tuesday   June   14.5
Tuesday   May    2.0
Wednesday June   14.5
Wednesday May    3.0

我的第二步将原始数据集中的“NA”值替换为在 test1 中计算的中位数。这就是我的问题所在。

Example$Qty[is.na(Example$Qty)] <- test1$median[match(Example$DayType,test1$DayType,Example$Month,test1$Month)][is.na(Example$Qty)]

例子

Match[] 只匹配每一天的中值,而不是逐月匹配每一天的中值。整个集合的输出是相同的七个重复值。我还没有弄清楚如何同时在两列上进行匹配。

Output:
Date         DayType   Month   GSEvtQty
2009-05-01   Monday    May     15.0    *should be 2.0, matching to June
2009-05-02   Tuesday   May     14.5    *should be 2.0, matching to June
2009-05-03   Wednesday May     14.5    *should be 3.0, matching to June
2009-06-01   Monday    June    15.0    *imputes correctly
2009-06-02   Tuesday   June    14.5    *imputes correctly
2009-06-03   Wednesday June    14.5    *imputes correctly
2010-05-01   Monday    May     1.0     
2010-05-02   Tuesday   May     2.0  
2010-05-03   Wednesday May     1.0 
2010-06-01   Monday    June    10.0
2010-06-02   Tuesday   June    15.0  
2010-06-03   Wednesday June    13.0   

我也尝试过使用 %in%:

Example$Qty[is.na(Example$Qty)] <- test1$median[Example$DayType %in% test1$DayType & Example$Month %in% test1$Month][is.na(Example$Qty)]

但这并不能正确匹配,并且只输出有限数量的值,而不是整个 NA 系列。

@Jaap 巧妙地建议通过 Zoo 包使用 na.aggregate:

setDT(Example)[, Value := na.aggregate("Qty", FUN = median), by = c("DayType","Month")]

由于某种原因不转换 NA:

Output:
 Date         Month   DayType   Qty
 2009-05-01   May     Monday    NA
 2009-05-02   May     Tuesday   NA
 2009-05-03   May     Wednesday NA
 2009-06-01   June    Monday    NA

任何建议将不胜感激!感谢您这么长时间坚持这篇文章,并期待在未来支付帮助。

【问题讨论】:

  • 您可以使用来自zoo-package 的na.aggregatean example.
  • 相关/可能重复:Replacing Missing Value in R
  • 好主意!我不知道那个功能。谢谢你,@Jaap。我使用了以下变体(源自您的优秀链接),但仍然收到所有 NA。知道我缺少什么吗? setDT(info)[, Value := na.aggregate("GSEvtQty", FUN = median), by =c("DayType","Month")]
  • 您能否在问题中包含reproducible example
  • 当然可以。刚刚更新。感谢您在我学习绳索时的耐心等待。期待未来更容易合作!

标签: r conditional-statements multiple-columns imputation


【解决方案1】:

这就是 merge 的创建目的。

info$GSEvtQty[is.na(info$GSEvtQty)]<- merge(info[is.na(info$GSEvtQty,)], test1, by=c("DayType", "Month"))[,"GSEvtQty"]

【讨论】:

  • 去看看。谢谢你,@doviod!上面输出了一个错误,说“选择了未定义的列”,所以我将它修改为下面(添加了一个逗号):info$GSEvtQty[is.na(info$GSEvtQty)]&lt;- merge(info[is.na(info$GSEvtQty),], test1, by=c("DayType", "Month"))[,"GSEvtQty"] 这允许它运行,但它仍然输出所有 NA。有什么想法吗?再次感谢您和@Jaap。知道的 R 足够危险,但还有很多东西要学!
猜你喜欢
  • 2016-08-29
  • 2018-09-08
  • 1970-01-01
  • 1970-01-01
  • 2021-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-11
相关资源
最近更新 更多