1

我正在运行一个ddply函数并不断收到错误。

data.frame 的结构:

str(visits.by.user)
'data.frame':   80317 obs. of  5 variables:
 $ ClientID    : Factor w/ 147792 levels "50912733","50098716",..: 1 3 4 5 6 7 8 10 11 12 ...
 $ TotalVisits      : int  64 231 18 21 416 290 3 13 1 7 ...
 $ TotalDayVisits: int  8 141 0 4 240 155 0 0 0 0 ...
 $ TotalNightVisits: int  56 90 18 17 176 135 3 13 1 7 ...
 $ quintile         : Factor w/ 5 levels "0-20","20-40",..: 5 5 4 4 5 5 2 4 1 3 ...

旁注: 我知道如何为随机数字数据创建样本数据 - 您如何应用具有 5 个级别的因子来构建具有代表性的样本?

ddply 代码:

summary.users <- ddply(data = subset(visits.by.user, TotalVisits > 0), 
                          .(quintile, TotalDayVisits, TotalNightVisits), 
                          summarize,
                          NumClients = length(ClientID))

错误信息:

Error in if (empty(.data)) return(.data) : 
 missing value where TRUE/FALSE needed

我认为这可能ddply需要我尝试分组的变量作为一个因素,所以我尝试了as.factor整数变量,但没有奏效。

谁能看到我哪里出错了?

编辑:添加顶部dput

structure(list(ClientID = structure(c(1L, 2L, 3L, 4L, 5L, 6L), .Label = c("50912733", "60098716", "50087112", "94752212", "78217771", "12884545"), class = "factor"),TotalVisits = c(80L, 92L, 103L, 18L, 182L, 136L), TotalDayVisits = c(56L, 90L, 18L, 17L, 176L, 135L), TotalNightVisits = c(24L, 2L, 85L, 1L, 6L, 1L), quintile = structure(c(5L, 5L, 4L, 4L, 5L, 5L), .Label = c("0-20", "20-40", "40-60", "60-80", "80-100"), class = "factor")), .Names = c("ClientID", "TotalVisits", "TotalDayVisits", "TotalNightVisits", "quintile"), row.names = c(NA,6L), class = "data.frame")
4

2 回答 2

6

您的第一个参数被命名data=,而ddply第一个参数名为.data. 如果我改变它,你的代码运行良好。

关于我的评论,这是我认为我过去遇到过的一个问题,但似乎在机制中隐含了类似的droplevels调用ddply。我很想听听更深入的解释它是如何工作的!

dat <- data.frame(x=1:20, z=factor(rep(letters[1:4], each=5)))

ddply(dat, .(z), summarise, length(x))
  z ..1
1 a   5
2 b   5
3 c   5
4 d   5
ddply(subset(dat, z!='a'), .(z), summarise, length(x))
  z ..1
1 b   5
2 c   5
3 d   5

这表现得很好。然而,看着因子水平让我感到惊讶:

ddply(subset(dat, z!='a'), .(z), summarise, paste(levels(z), collapse=' '))
  z     ..1
1 b a b c d
2 c a b c d
3 d a b c d
于 2012-08-01T22:46:46.687 回答
0

这很好用:

summary.users <- ddply(subset(visits.by.user, TotalVisits > 0), 
                          .(quintile, TotalDayVisits, TotalNightVisits), 
                          summarize, NumClients = length(ClientID))

> summary.users
  quintile TotalDayVisits TotalNightVisits NumClients
1    60-80             17                1          1
2    60-80             18               85          1
3   80-100             56               24          1
4   80-100             90                2          1
5   80-100            135                1          1
6   80-100            176                6          1
于 2012-08-02T00:34:20.977 回答