web-dev-qa-db-ja.com

因子のカウントをdplyrで要約する

データフレームを列(所有者)ごとにグループ化し、各観測で因子の各タイプのカウントを持つ新しいデータフレームを出力します。実際のデータフレームはかなり大きく、10の異なる要因があります。

入力例を次に示します。

library(dplyr)
df = tbl_df(data.frame(owner=c(0,0,1,1), obs1=c("quiet", "loud", "quiet", "loud"), obs2=c("loud", "loud", "quiet", "quiet")))

  owner  obs1  obs2
1     0 quiet  loud
2     0  loud  loud
3     1 quiet quiet
4     1  loud quiet

次のような出力を探していました。

out = data.frame(owner=c("0", "0", "1", "1"), observation=c("obs1", "obs2", "obs1", "obs2"), quiet=c(1, 0, 1, 2), loud=c(1, 2, 1, 0))

  owner observation quiet loud
1     0        obs1     1    1
2     0        obs2     0    2
3     1        obs1     1    1
4     1        obs2     2    0

溶けると途中で私を取得します。

melted = tbl_df(melt(df, id=c("owner")))

  owner variable value
1     0     obs1 quiet
2     0     obs1  loud
3     1     obs1 quiet
4     1     obs1  loud
5     0     obs2  loud
6     0     obs2  loud
7     1     obs2 quiet
8     1     obs2 quiet

しかし、最後のステップは何ですか? 「値」が数値の場合、私はただ行きます:

melted %>% group_by(owner, variable) %>% summarise(counts=sum(value))

本当にありがとう!

16
Rory Kirchner

tidyrdplyrを併用できます

library(dplyr)
library(tidyr)

 df %>%
 gather(observation, Val, obs1:obs2) %>% 
 group_by(owner,observation, Val) %>% 
 summarise(n= n()) %>%
 ungroup() %>%
 spread(Val, n, fill=0)

出力を与える

  #    owner observation loud quiet
  #1     0        obs1    1     1
  #2     0        obs2    2     0
  #3     1        obs1    1     1
  #4     1        obs2    0     2
25
akrun

2017年の答えは

library(dplyr)
library(tidyr)

gather(df, key, value, -owner) %>%
  group_by(owner, key, value) %>%
  tally %>% 
  spread(value, n, fill = 0)

出力を与える

Source: local data frame [4 x 4]
Groups: owner, key [4]

  owner   key  loud quiet
* <dbl> <chr> <dbl> <dbl>
1     0  obs1     1     1
2     0  obs2     2     0
3     1  obs1     1     1
4     1  obs2     0     2
27
Sam Clifford

dplyrを放棄したい場合は、リストに分割できます。

df <- split(df, list(df[[obs1]], df[[obs2]])

countが必要な場合は、sapplyまたはlapply呼び出しを作成してリストを実行し、それぞれのカウントを取得します。または、文字通り他の必要な関数。

3
black_sheep07