R 用 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))

我可以使用spread来自tidyr将其更改为宽格式。

> 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

或者一个可能的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_widerpivot_longer 函数(当前处于 maturing 状态),因此,更新的方法是

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 扩展多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30592094/

相关文章:

R:通过具有小拼写错误的字符列连接两个数据框

r - 如何在R中对组内的列进行排序?

r - 使用 native 管道将预测与变异结合使用

r - 使用 Shiny 的应用程序创建响应式(Reactive)数据框

r - 将 for 循环方程中的最后一个变量存储到数组中

r - 如何在R中提取文本文件中间的数字

pandas - 如何检查 pandas 数据框中一列对另一列的依赖关系

r - 将不同列表的子列表组合成数据框列表

scala - 如何在流数据集上执行 df.rdd 或 df.collect().foreach?

r - 计算三列之间的最小差异并给出相应的值