データフレームを列(所有者)ごとにグループ化し、各観測で因子の各タイプのカウントを持つ新しいデータフレームを出力します。実際のデータフレームはかなり大きく、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))
本当にありがとう!
tidyr
とdplyr
を併用できます
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
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
dplyr
を放棄したい場合は、リストに分割できます。
df <- split(df, list(df[[obs1]], df[[obs2]])
count
が必要な場合は、sapply
またはlapply
呼び出しを作成してリストを実行し、それぞれのカウントを取得します。または、文字通り他の必要な関数。