R中如何将长格式转换为宽格式并配对列?

3
我将尝试将一个数据集从长格式转换为宽格式。
以下是我的输入数据:
```html

...

```
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,不允许我保持“pair”结构。
非常感谢任何帮助!谢谢!

尽管代码没有成功,但看到您尝试过的代码会很有帮助。 - camille
我已经更新了我的问题!抱歉! - qnp1521
2个回答

3

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接