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 卡住(糟糕!)。

4

2 回答 2

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
于 2013-02-08T17:50:12.640 回答
3

我不确定我是否理解正确(你有两个data.frames mydfand mydf2)。我假设你的数据在mydf. 使用aggregate

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

这是你想要的?

注意:这里count创建的变量只是为了直接获取第 3 列的输出为count.

ddplyfrom 的替代方案plyr

# 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)))
于 2013-02-08T17:33:56.790 回答