【问题标题】:How to reshape data from long to wide format so to achieve this output?如何将数据从长格式重塑为宽格式以实现此输出?
【发布时间】:2018-10-07 08:01:59
【问题描述】:

我在使用 tidyr 包重新排列以下数据框时遇到问题:

data <- data.frame(
    name = rep(c("John", "Mary", "Peter", "Sarah"), each=2),
    firm = c("a", "b", "c", "d", "a", "b", "c", "d"),
    rank = rep(1:2, 4),
    value = rnorm(8)
    )

我想重塑它,使每个唯一的“名称”变量都是一个行名,“值”作为沿该行的观察值,“排名”作为列名,后跟“公司”名称。有点像这样:

  name          1      firm_1            2       firm_2
  John       0.3407997      a        -0.3795377      b
  Mary      -0.8981073      c       -0.5013782       d
  Peter     0.3407997       a        -0.3795377      b
  Sarah     -0.8981073      c       -0.5013782       d

【问题讨论】:

  • 试试library(data.table);dcast(setDT(data), name ~ rank, value.var = c("firm", "value"))
  • 您可以在 akrun 的解决方案后面添加 [,c(1,4,2,5,3)] 以像您的解决方案一样对其进行排序。
  • 这与this questionthis question 密切相关。你可以在那里尝试解决方案,然后看看你卡在哪里。

标签: r tidyr


【解决方案1】:

我们可以使用dplyrtidyr 的组合,类似于@aosmith 评论中的帖子。

library(dplyr) # [1] ‘1.0.0’
library(tidyr) # [1] ‘1.1.0’

data %>% pivot_wider(names_from = rank, values_from = c(firm, value)) %>%
        select(name, `1` = value_1, firm_1, `2` = value_2, firm_2)

为了完全从长格式变为宽格式,我们必须采用 values_from 不是 1 列,而是 2 列,因为原始 data 有 4 列,而不是 3 列。

【讨论】:

    猜你喜欢
    • 2022-01-11
    相关资源
    最近更新 更多