2013-02-08 128 views
2

我想获取以下数据,然后使用这些数据创建一个表,其中包含按状态细分的信息。总结一个数据帧

这里的数据:

> head(mydf2, 10) 
    lead_id buyer_account_id amount state 
1 52055267    62 300 CA 
2 52055267    64 264 CA 
3 52055305    64 152 CA 
4 52057682    62  75 NJ 
5 52060519    62 750 OR 
6 52060519    64 574 OR 
15 52065951    64 152 TN 
17 52066749    62 600 CO 
18 52062751    64 167 OR 
20 52071186    64 925 MN 

我媒体链接子集,我很感兴趣,和刚才我感兴趣的数据状态:

mydf2 = subset(mydf, state %in% c("NV","AL","OR","CO","TN","SC","MN","NJ","KY","CA")) 

这里有一个想法我在找什么:

State  Amount  Count 
NV  1    50 
NV  2    35 
NV  3    20 
NV  4    15 
AL  1    10 
AL  2    6 
AL  3    4 
AL  4    1 
... 

对于每个州,我试图找到每个数量“级别”的计数。我没有必要需要组数量可变的,但要记住,他们不只是1,2,3等

> mydf$amount 
    [1] 300 264 152 75 750 574 113 152 750 152 675 489 188 263 152 152 600 167 34 925 375 156 675 152 488 204 152 152 
    [29] 600 489 488 75 152 152 489 222 563 215 452 152 152 75 100 113 152 150 152 150 152 452 150 152 152 225 600 620 
    [57] 113 152 150 152 152 152 152 152 152 152 640 236 152 480 152 152 200 152 560 152 240 222 152 152 120 257 152 400 

是否有R表示此一个优雅的解决这个或将我被卡住使用Excel(yuck!)。

+2

你看过'表'吗? – A5C1D2H2I1M1N2O1R2T1 2013-02-08 17:19:17

+0

你能解释一下你的意思吗?“我不需要对数量变量进行分组,但是请记住它们不仅仅是1,2,3等。” – A5C1D2H2I1M1N2O1R2T1 2013-02-08 17:25:14

+0

对于这个例子,我使用了1,2,3等,但实际上有很多数量值。我正是这个意思。 – ATMathew 2013-02-08 17:32:27

回答

3

我不知道我是否理解正确(您有两个data.framesmydfmydf2)。我假设你的数据在mydf。使用aggregate

mydf$count <- 1:nrow(mydf) 
aggregate(data = mydf, count ~ amount + state, length) 

这是你在找什么?

注意:这里的count是创建一个变量,直接得到第三列的输出为count

替代与ddplyplyr

# no need to create a variable called count 
ddply(mydf, .(state, amount), summarise, count=length(lead_id)) 

这里有一个可以使用存在于一个人的数据,而不是lead_id任何列。即使state

ddply(mydf, .(state, amount), summarise, count=length(state)) 

或等价不使用总结:

ddply(mydf, .(state, amount), function(x) c(count=nrow(x))) 
+0

这正是我所期待的。谢谢! – ATMathew 2013-02-08 17:51:45

+0

如果没有引用“lead_id”,我得到eval中的错误(expr,envir,enclos):找不到对象'lead_id'。你可以用我的玩具例子来试试它,看看它是否按预期为你工作?同样在玩具的例子中,“聚合”的时钟速度比“ddply”快25倍。也可以直接在count中加入count('aggregate(data = mydf,1:nrow(mydf)〜amount + state,length)'),但是你必须清理结果变量名。 – A5C1D2H2I1M1N2O1R2T1 2013-02-08 18:12:14

+0

@Arun,oops;)任何想法为什么输入它作为引用的作品? – A5C1D2H2I1M1N2O1R2T1 2013-02-08 18:22:37

4

这里是我的,你正在试图做什么的认识:

开始用一个简单的data.frame与26个国家和只占范围从1到50(比范例中的范围要高得多)。

set.seed(1) 
mydf <- data.frame(
    state = sample(letters, 500, replace = TRUE), 
    amount = sample(1:50, 500, replace = TRUE) 
) 

head(mydf) 
# state amount 
# 1  g  28 
# 2  j  35 
# 3  o  33 
# 4  x  34 
# 5  f  24 
# 6  x  49 

下面是一些简单的列表。我还删除了频率等于零的任何实例,并且我按状态对输出进行了重新排序。

temp1 <- data.frame(table(mydf$state, mydf$amount)) 
temp1 <- temp1[!temp1$Freq == 0, ] 
head(temp1[order(temp1$Var1), ]) 
#  Var1 Var2 Freq 
# 79  a 4 1 
# 157  a 7 2 
# 391  a 16 1 
# 417  a 17 1 
# 521  a 21 1 
# 1041 a 41 1 
dim(temp1) # How many rows/cols 
# [1] 410 3 

这是一个有点不同的制表。我们在分组“数量”值之后列表。在这里,我已经手动指定了休息时间,但是您可以轻松地让R决定最好的想法。

temp2 <- data.frame(table(mydf$state, 
          cut(mydf$amount, 
           breaks = c(0, 12.5, 25, 37.5, 50), 
           include.lowest = TRUE))) 
temp2 <- temp2[!temp2$Freq == 0, ] 
head(temp2[order(temp2$Var1), ]) 
# Var1  Var2 Freq 
# 1  a [0,12.5] 3 
# 27 a (12.5,25] 3 
# 79 a (37.5,50] 3 
# 2  b [0,12.5] 2 
# 28 b (12.5,25] 6 
# 54 b (25,37.5] 5 
dim(temp2) 
# [1] 103 3