【问题标题】:Reporting missing values per subgroup in R from a data frame从数据框中报告 R 中每个子组的缺失值
【发布时间】:2014-07-17 15:57:45
【问题描述】:

我有一个类似于下面的数据框。

Group Expenditure Date
A     56434       22 June 2014
B     54231       1 July 2013
B     1412        9 May 2011
A     NA           28 July 2009
A     NA           3 July 2009
C     98          2 July 1999
C     NA           14 July 2004

我有兴趣为支出列创建缺失值报告。一个值应返回每列缺失值的数量,使用以下代码解决此问题

sapply(exp.dta, function(x) sum(is.na(x)))

此外,我想报告每个日期的缺失值数量。使用 as.Date 函数将日期列格式化为正确的日期。至于现在,我对报告每个子组的缺失值不感兴趣。

【问题讨论】:

  • 您好 Henrik,感谢您的关注。数据从 CSV 文件中导入,其中缺失的支出数据编码为 NA。

标签: r dataframe missing-data na sapply


【解决方案1】:

试试这个:

 library(plyr)
 ddply(your.data, .(Date), summarize, nNA = sum(is.na(Expenditure))

这会将数据按Date 拆分为子组,并将函数sum(is.na()) 应用于这些子组的Expenditure 列。

例如,

 df <- read.table(text="Group Expenditure Date
 A     56434       22June2014
 B     54231       1July2013
 B     1412        9May2011
 A     NA           28July2009
 A     NA           3July2009
 C     98          2July1999
 C     NA           14July2004 ", sep="", header=T)

 ddply(df, .(Date), summarize, nNA=sum(is.na(Expenditure)))

产量:

         Date nNA
 1 14July2004   1
 2  1July2013   0
 3 22June2014   0
 4 28July2009   1
 5  2July1999   0
 6  3July2009   1
 7   9May2011   0

还有几个base-解决方案。这里有一些例子:

  • 使用by

    by(df, df$Date, function(x) sum(is.na(x$Expenditure)))
    
  • 使用tapply

    with(df, tapply(Expenditure, Date, function(x) sum(is.na(x))))
    
  • 使用aggregate(向@user20650 致敬)

    aggregate(df$Expenditure, by=list(df$Date), FUN= function(x) sum(is.na(x)))
    

它们都给出相同的结果,但格式略有不同。选择你最喜欢哪一个。对于更一般的处理,这种问题称为“split-apply-combine”,参见例如here.

【讨论】:

  • 您关于“拆分应用组合”策略的链接(Hadley Wickham 的“数据分析的拆分应用组合策略”)非常有用。对于网络绊脚石,这与data.table可能也有帮助:brodieg.com/?p=7
【解决方案2】:

按照您已经编写的代码,您可以在其中添加split

dat <- read.table(h=T, text = "Group Expenditure Date
  A     56434       22-June-2014
  B     54231       1-July-2013
  B     1412        9-May-2011
  A     NA           28-July-2009
  A     NA           3-July-2009
  C     98          2-July-1999
  C     NA           14-July-2004")

> sapply(split(dat$Expenditure, dat$Group), function(x) sum(is.na(x)))
# A B C 
# 2 0 1 

或对于每个日期,

> s <- split(dat$Expenditure, dat$Date)
> as.matrix(sapply(s, function(x) sum(is.na(x))))
#              [,1]
# 14-July-2004    1
# 1-July-2013     0
# 22-June-2014    0
# 28-July-2009    1
# 2-July-1999     0
# 3-July-2009     1
# 9-May-2011      0

【讨论】:

    【解决方案3】:

    或者,使用dplyr

    library('dplyr')
    summarize(group_by(df, Date), nNA = sum(is.na(Expenditure)))
    

    【讨论】:

      猜你喜欢
      • 2019-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-14
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      相关资源
      最近更新 更多