R 从长到宽,有一对柱子

标签 r data.table tidyverse

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

我的输入数据如下:

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,不允许我保留“对”结构。

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

最佳答案

在这里,我们可以在 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

关于R 从长到宽,有一对柱子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59639039/

相关文章:

r - 在现有数据框中添加向量作为新列

r - 使用动态列名以编程方式分配 data.table 中的列

R 错误 : dependencies ‘xml2’ , ‘httr’ 不适用于软件包 (Linux Mint 20.1)

r - 如何计算R中1之间的0数?

python - Python Pandas 中因子变量的最接近等价物

r - 将 ff 对象转换为 data.frame

r - 在dplyr 0.7.0+中正确使用dplyr::select,使用字符向量选择列

r - data.table rolling join 生效时如何标记

r - 如何使用 dplyr 将函数逐行应用到数据框中,而不对列名称进行硬编码

r - 在 `dplyr` 中,当使用 `pivot_wide` 时,我想同时替换 'NA'