R使用tidyr扩展多个列

R使用tidyr扩展多个列,r,dataframe,dplyr,tidyr,R,Dataframe,Dplyr,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)) 但是,我如何分散两个值,例如A和B,从而使输出类似于 month Amy.A Bob.A Amy.B Bob.B 1 1

以这个样本变量为例

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))
但是,我如何分散两个值,例如
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

下面是一个使用
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
解决方案

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

编辑2019年10月22日

@gjabel评论中所述,更新的tidyr版本(v1.0.0+) 现在有了
pivot\u更宽的
pivot\u更长的
功能(当前处于状态),因此,一种新的方法是

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
pivot\u更宽(数据=df,
id_cols=月份,
姓名_from=学生,
值_from=c(“A”、“B”))
##tibble:3 x 5
#一个月A_艾米A_鲍勃B_艾米B_鲍勃
#         
#   1     1     9     8     6     5
#   2     2     7     6     7     6
#   3     3     6     9     8     7

@PolarBear您希望如何处理复制?你想算数吗?什么意思?尝试
数据。表
解决方案并将
fun.aggregate=sum
添加到
dcast
@PolarBear
spread
聚集
不是为应用函数而设计的。为此,您可能需要使用
dplyr
。或者你可以像我上面建议的那样使用
dcast
。或者,如果你对此感觉强烈,也可以发布一个新问题。我为这些问题做了一个基准测试:
pivot\u-wide(data=df,id\u-cols=month,names\u-from=student,values\u-from=c(“a”,“B”)
应该在tidyr 1.0.0或更高版本下工作pivot\u-wide也可以在变量名(在本例中为a和B)中不带引号的情况下工作,即pivot\u-wide(data=df,id\u cols=month,name\u from=student,value\u from=c(A,B))
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