2014-07-17 59 views
1

我有一个类似于下面的数据框。从数据帧报告R中每个子组的缺失值

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 

我有兴趣为Expenditure列创建缺失值报告。一个值应该返回缺少的每列值的数量,这是解决了使用下面的代码

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

另外,我想报告缺失值的数量每个日期。日期列使用作为日期函数格式化为适当的日期。至于现在,我不想报告每个子组的缺失值。

+0

喜Henrik,感谢您表达兴趣。数据从CSV文件导入,其中缺少支出数据编码为NA。 – Konrad

回答

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 
+0

像魅力一样工作,谢谢。 – Konrad

3

试试这个:

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 -solutions。这里的一些例子:

  • 使用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))) 
    

这些都给出了相同的结果,但格式略有不同。选择你最喜欢的一个。对于更一般的治疗,这种问题被称为“分裂 - 应用 - 组合”,见例如。 here

+0

您关于'分拆 - 套用 - 合并'策略的链接(Hadley Wickham的“数据分析的分解 - 应用 - 组合策略”)非常有用。对于网络开发者来说,使用'data.table'可能会有所帮助:http://www.brodieg.com/?p=7 – pidosaurus

1

或者,使用dplyr

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