4

このようなデータ フレームがあります (リンクを参照)。以下で生成される出力を取得し、さらに一歩進んで、トーン変数を n 変数と平均変数の両方に分散させたいと思います。このトピックはこれに関係しているようですが、うまくいきません: dcast と同様に、tidyr で複数の列にスプレッドを使用することは可能ですか?

最終的なテーブルの 1 つの列にソース変数を配置してから、tone-n 変数とtone-avg 変数を列に配置したいと思います。したがって、列ヘッダーを「ソース」-「For - n」-「Against - n」「For -Avg」-「Against - Avg」にしたいと思います。これは公開用であり、さらなる計算用ではありません。データを提示するためのものです。この方法でデータを提示する方が直感的に思えます。ありがとうございました。

#variable1
Politician.For<-sample(seq(0,4,1),50, replace=TRUE)
#variable2
Politician.Against<-sample(seq(0,4,1),50, replace=TRUE)
#Variable3
Activist.For<-sample(seq(0,4,1),50,replace=TRUE)
#variable4
Activist.Against<-sample(seq(0,4,1),50,replace=TRUE)
#dataframe
df<-data.frame(Politician.For, Politician.Against, Activist.For,Activist.Against)

#tidyr
df %>%
 #Gather all columns 
 gather(df) %>%
 #separate by the period character 
 #(default separation character is non-alpha numeric characterr) 
 separate(col=df, into=c('source', 'tone')) %>%
 #group by both source and tone  
 group_by(source,tone) %>%
 #summarise to create counts and average
 summarise(n=sum(value), avg=mean(value)) %>%
 #try to spread
 spread(tone, c('n', 'value'))
4

2 に答える 2

5

あなたが望むのは、カウントを分割し、以下の個別の観察として意味する別の収集だと思いgather(type, val, -source, -tone)ます。

gather(df, who, value) %>%
    separate(who, into=c('source', 'tone')) %>%
    group_by(source, tone) %>%
    summarise(n=sum(value), avg=mean(value)) %>%
    gather(type, val, -source, -tone) %>%
    unite(stat, c(tone, type)) %>%
    spread(stat, val)

収量

Source: local data frame [2 x 5]

      source Against_avg Against_n For_avg For_n
1   Activist        1.82        91    1.84    92
2 Politician        1.94        97    1.70    85
于 2015-05-11T19:12:48.873 に答える
1

構文の使用data.table(@akrun に感謝):

library(data.table)
dcast(
  setDT(melt(df))[,c('source', 'tone'):=
      tstrsplit(variable, '[.]')
    ][,list(
      N  = sum(value),
      avg= mean(value))
    ,by=.(source, tone)],
  source~tone,
  value.var=c('N','avg'))
于 2015-05-11T19:12:21.163 に答える