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.frame26の状態と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

私が正しく理解しているかどうかはわかりません(2つとがdata.frames mydfあります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 に答える