以这个样本变量为例

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将其更改为宽格式.

> df[, -4] %>% spread(student, A)
  month Amy Bob
1     1   9   8
2     2   7   6
3     3   6   9

但是,我如何将两个值(例如AB)进行扩散,从而使输出类似于

  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

或者一个可能的解决方案

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

EDIT 22/10/2019

正如@gjabel comments 中提到的,更新的tidyr版本(v1.0.0+)

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相关问答推荐

更改网格的crs以匹配简单要素点对象的crs

在数据表中呈现数学符号

删除facet_wrap标签之间的水平线

行式dppr中的变量列名

在发布到PowerBI Service时,是否可以使用R脚本作为PowerBI的数据源?

如何计算R数据集中每个女性的子元素数量?

获取列中值更改的行号

如何在geom_col中反转条

删除具有相同标题的tabPanel(shinly)

即使硬币没有被抛出,也要保持对其的跟踪

提取第一个下划线和最后一个下划线之间的任何内容,例外情况除外

在RStudio中堆叠条形图和折线图

计算数据帧中指定值之前的行数,仅基于每行之后的future 行,单位为r

当我添加美学时,geom_point未对齐

R -如何分配夜间GPS数据(即跨越午夜的数据)相同的开始日期?

如何在使用Alpha时让geom_curve在箭头中显示恒定透明度

按镜像列值自定义行顺序

将数据从一列转换为按组累计计数的单个虚拟变量

在GT()中的列之间添加空格

图中显示错误 colored颜色 的图例geom_sf