r-汇总函数中的唯一值,并使用NA作为0

时间:2014-10-24 14:55:22

标签: r function conditional-statements aggregate

我有一张表:

ppp<-data.frame(client=c(1,1,1,3,3,4), 
                calldate=c('2014-08-07', NA,'2014-08-06',NA, '2014-08-08',NA),
                paydate=c('2014-08-07', '2014-08-09', NA, '2014-08-06',NA,'2014-08-06' ))

我需要得到每个客户的calldate计数。我试过了:

my.fun<-function (x) {sum(!is.na(unique(x)))}
ppp2<-aggregate(calldate~(client+calldate) , ppp, my.fun)

我得到了:

> ppp2
  client calldate
      1        2
      3        1

正如你所看到的那样,我丢失了3号客户端,我必须拥有所有这些客户端,如果他们没有接到电话,则为零。

  client calldate
      1        2
      3        1
      3        0

如何计算日期,如果没有日期则为0? 我也尝试过:

my.fun<-function (x) {length(unique(x))}

得到了相同的结果

我也尝试了以下内容:

my.fun<-function (x) {if (is.na(x)) {0} else {length(unique(x))}}

我收到错误:

  

警告消息:如果(is.na(x)){:条件的长度为&gt; 1   并且只使用第一个元素

1 个答案:

答案 0 :(得分:3)

如果您使用参数na.action = na.pass,它会起作用。否则,aggregate将忽略NA值。

aggregate(calldate ~ client, ppp, my.fun, na.action = na.pass)
#   client calldate
# 1      1        2
# 2      3        1
# 3      4        0