我正在尝试获取以下数据,然后使用此数据创建一个表,其中包含按州分解的信息。
以下是数据:
> 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困住(哎呀!)。
答案 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
mydf
和mydf2
)。我假设您的数据位于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))