15

「week」と「id」の2つの変数のレベルの各組み合わせのカウントを取得しようとしています。結果に「id」を行、「week」を列、カウントを値にしたいと思います。

私がこれまでに試したことの例(ダミー変数= 1を追加し、それfun.aggregate = sumを超えるなど、他の多くのことを試しました):

library(plyr)
ddply(data, .(id), dcast, id ~ week, value_var = "id", 
        fun.aggregate = length, fill = 0, .parallel = TRUE)

しかし、この関数が終了していないので、私は何か間違ったことをしているに違いありません。これを行うためのより良い方法はありますか?

入力:

id      week
1       1
1       2
1       3
1       1
2       3

出力:

  1  2  3
1 2  1  1
2 0  0  1
4

4 に答える 4

20

table次のコマンドを使用できます。

table(data$id,data$week)

    1 2 3
  1 2 1 1
  2 0 0 1

「id」と「week」がデータフレームの唯一の列である場合は、次のように使用できます。

table(data)
#    week
# id  1 2 3
#   1 2 1 1
#   2 0 0 1
于 2011-11-18T17:16:25.690 に答える
14

これは必要ありませんddplydcastfromreshape2で十分です:

dat <- data.frame(
    id = c(rep(1, 4), 2),
    week = c(1:3, 1, 3)
)

library(reshape2)
dcast(dat, id~week, fun.aggregate=length)

  id 1 2 3
1  1 2 1 1
2  2 0 0 1

編集:ベースRソリューション(tableJoshua Uhlrichによって投稿された-以外)については、次を試してくださいxtabs

xtabs(~id+week, data=dat)

   week
id  1 2 3
  1 2 1 1
  2 0 0 1
于 2011-11-18T17:14:59.970 に答える
11

非常に時間がかかる理由ddplyは、グループによる分割が並行して実行されないため('splits'での計算のみ)、したがって、グループの数が多い場合は遅くなります(そして.parallel = T)は役に立ちません。

data.table::dcast(バージョン> = 1.9.2)を使用するアプローチdata.tableは、時間とメモリにおいて非常に効率的であるはずです。この場合、デフォルトの引数値に依存して、単純に次を使用できます。

library(data.table) 
dcast(setDT(data), id ~ week)
# Using 'week' as value column. Use 'value.var' to override
# Aggregate function missing, defaulting to 'length'
#    id 1 2 3
# 1:  1 2 1 1
# 2:  2 0 0 1

または、引数を明示的に設定します。

dcast(setDT(data), id ~ week, value.var = "week", fun = length)
#    id 1 2 3
# 1:  1 2 1 1
# 2:  2 0 0 1

data.table1.9.2より前の代替案については、編集を参照してください。

于 2012-09-14T02:42:45.457 に答える
1

tidyverseオプションは次のようになります:

library(dplyr)
library(tidyr)

df %>%
  count(id, week) %>%
  pivot_wider(names_from = week, values_from = n, values_fill = list(n = 0))
  #spread(week, n, fill = 0) #In older version of tidyr

#     id   `1`   `2`   `3`
#   <dbl> <dbl> <dbl> <dbl>
#1     1     2     1     1
#2     2     0     0     1

のみを使用pivot_wider-

tidyr::pivot_wider(df, names_from = week, 
                   values_from = week, values_fn = length, values_fill = 0)

またはtabylfromを使用janitor

janitor::tabyl(df, id, week)
# id 1 2 3
#  1 2 1 1
#  2 0 0 1

データ

df <- structure(list(id = c(1L, 1L, 1L, 1L, 2L), week = c(1L, 2L, 3L, 
1L, 3L)), class = "data.frame", row.names = c(NA, -5L))
于 2019-02-05T00:49:54.177 に答える