使用 spread 通过 tidyr 创建两个值列
Using spread to create two value columns with tidyr
我有一个看起来像这样的数据框(请参阅 link)。我想采用下面产生的输出,并通过将色调变量分布在 n 和平均变量上更进一步。看起来这个话题可能与此有关,但我无法让它发挥作用:
Is it possible to use spread on multiple columns in tidyr similar to dcast?
我希望最后的 table 将源变量放在一列中,然后将 tone-n 和 tone-avg 变量放在列中。所以我希望列 headers 为 "source" - "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'))
使用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'))
我想你想要的是另一个 gather 来分解计数和平均值作为单独的观察,下面的 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
我有一个看起来像这样的数据框(请参阅 link)。我想采用下面产生的输出,并通过将色调变量分布在 n 和平均变量上更进一步。看起来这个话题可能与此有关,但我无法让它发挥作用: Is it possible to use spread on multiple columns in tidyr similar to dcast?
我希望最后的 table 将源变量放在一列中,然后将 tone-n 和 tone-avg 变量放在列中。所以我希望列 headers 为 "source" - "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'))
使用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'))
我想你想要的是另一个 gather 来分解计数和平均值作为单独的观察,下面的 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