本文介绍了R 用 tidyr 扩展多列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
取这个样本变量
df <- data.frame(month=rep(1:3,2),
student=rep(c("Amy", "Bob"), each=3),
A=c(9, 7, 6, 8, 6, 9),
B=c(6, 7, 8, 5, 6, 7))
我可以使用 tidyr
中的 spread
将其更改为宽格式.
I can use spread
from tidyr
to change this to wide format.
> df[, -4] %>% spread(student, A)
month Amy Bob
1 1 9 8
2 2 7 6
3 3 6 9
但是我怎样才能传播两个值,例如A
和 B
,这样输出就像
But how can I spread two values e.g. both A
and B
, such that the output is something like
month Amy.A Bob.A Amy.B Bob.B
1 1 9 8 6 5
2 2 7 6 7 6
3 3 6 9 8 7
推荐答案
这是一个使用 data.table
的可能既简单又高效的解决方案
Here's a possible both simple and very efficient solution using data.table
library(data.table) ## v >= 1.9.6
dcast(setDT(df), month ~ student, value.var = c("A", "B"))
# month Amy_A Bob_A Amy_B Bob_B
# 1: 1 9 8 6 5
# 2: 2 7 6 7 6
# 3: 3 6 9 8 7
或者一个可能的tidyr
解决方案
Or a possible tidyr
solution
df %>%
gather(variable, value, -(month:student)) %>%
unite(temp, student, variable) %>%
spread(temp, value)
# month Amy_A Amy_B Bob_A Bob_B
# 1 1 9 6 8 5
# 2 2 7 7 6 6
# 3 3 6 8 9 7
编辑 22/10/2019
正如 @gjabel 在评论中提到的,较新的 tidyr 版本 (v1.0.0+)现在有 pivot_wider
和 pivot_longer
功能(目前在 成熟 状态),因此,一种更新的方法是
As mentioned in comments by @gjabel, newer tidyr versions (v1.0.0+)have now pivot_wider
and pivot_longer
functions (currently in maturing state), hence, a newer approach would be
pivot_wider(data = df,
id_cols = month,
names_from = student,
values_from = c("A", "B"))
# # A tibble: 3 x 5
# month A_Amy A_Bob B_Amy B_Bob
# <int> <dbl> <dbl> <dbl> <dbl>
# 1 1 9 8 6 5
# 2 2 7 6 7 6
# 3 3 6 9 8 7
这篇关于R 用 tidyr 扩展多列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!