总结一个数据框

时间:2013-02-08 17:17:25

标签: r

我正在尝试获取以下数据,然后使用此数据创建一个表,其中包含按州分解的信息。

以下是数据:

> 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困住(哎呀!)。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

我不确定我是否理解正确(您有两个data.frames mydfmydf2)。我假设您的数据位于mydf。使用aggregate

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

这是你在找什么?

注意:此处count是一个变量,其创建只是为了直接将第3列的输出作为count

来自ddply的{​​{1}}的备选方案:

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))