【问题标题】:R long to wide with pair of columnsR 长到宽,带有一对柱子
【发布时间】:2020-04-25 14:05:07
【问题描述】:

我正在尝试将数据集从长格式转换为宽格式。

我的输入数据如下:

df <- data.frame(year = c(2011:2013),
             T1 = c("a", "b", "c"),
             T2 = c("b", "c", "d"),
             V1 = rep(1, 3),
             V2 = rep(2, 3))

想要的输出在哪里

df2 <- data.frame(year = c(2011:2013),
              a = c(1, 0, 0),
              b = c(2, 1, 0),
              c = c(0, 2, 1),
              d = c(0, 0, 2))

我认为使这更具挑战性(至少对我而言)是因为 T1 和 V1 列是“对”,T2 和 V2 也是如此。试图收集列 T1 和 T2 然后传播(或 dcast)它,但似乎不起作用。

这是我尝试过的。

require(data.table)
dt <- setDT(df)
tmp <- melt(dt, measure.vars = c("T1", "T2"))
dcast(tmp, year ~ value, value.var = c("V1", "V2"))

当我 dcast 时,V1_a 和 V2_a 分别取值 1 和 2,不允许我保留“对”结构。

任何帮助将不胜感激!谢谢!

【问题讨论】:

  • 查看您尝试过的代码会很有帮助,即使它不起作用
  • 我已经更新了我的问题!抱歉!

标签: r data.table tidyverse


【解决方案1】:

在这里,我们可以在data.table 语法中使用measurepatterns

library(data.table)
dcast(melt(setDT(df), measure = patterns("^T", "^V")), 
      year ~ value1, value.var = 'value2', fill = 0)
#   year a b c d
#1: 2011 1 2 0 0
#2: 2012 0 1 2 0
#3: 2013 0 0 1 2

【讨论】:

    【解决方案2】:

    您可以先使用pivot_longer 分别使用TV 对来获取长格式数据,然后再使用pivot_wider 将其移回宽格式。

    library(dplyr)
    library(tidyr)
    
    df %>%
      pivot_longer(cols = -year, names_to = c(".value", "cols"), 
                   names_pattern = "([A-Z])(\\d)") %>%
      select(-cols) %>%
      pivot_wider(names_from = T, values_from = V, values_fill = list(V = 0))
    
    # A tibble: 3 x 5
    #   year     a     b     c     d
    #  <int> <dbl> <dbl> <dbl> <dbl>
    #1  2011     1     2     0     0
    #2  2012     0     1     2     0
    #3  2013     0     0     1     2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-08
      • 1970-01-01
      • 2021-10-23
      • 1970-01-01
      • 1970-01-01
      • 2022-11-23
      • 2021-04-21
      • 2017-07-22
      相关资源
      最近更新 更多