【问题标题】:How to reshape a dataframe in R, when values and variables are in the column names? [duplicate]当值和变量在列名中时,如何在 R 中重塑数据框? [复制]
【发布时间】:2023-12-04 04:29:01
【问题描述】:

编辑:

经过进一步检查,这个数据集比我之前认为的要疯狂得多。

值已封装在列名中!

我的数据框如下所示:

| ID | Year1_A | Year1_B | Year2_A | Year2_B |
|----|---------|---------|---------|---------|
| 1  | a       | b       | 2a      | 2b      |
| 2  | c       | d       | 2c      | 2d      |

我正在寻找一种方法来重新格式化它:

| ID | Year | _A  | _B  |
|----|------|-----|-----|
| 1  | 1    | a   |  b  |
| 1  | 2    | 2a  |  2b |
| 2  | 1    | c   |  d  |
| 2  | 2    | 2c  |  2d | 

下面的答案很好,而且效果很好,但问题是数据框需要更多的工作——可能会以某种方式分散开来,以便每行有 3 列。

我最好的想法是执行merge(df, df, by="ID"),然后过滤掉不需要的行,但这很快就会变得笨拙。

df <- data.frame(ID = 1:2, Year1_A = c('a', 'c'), Year1_B = c('b','d' ), Year2_A = c('2a', '2c'), Year2_B = c('2b', '2d'))

【问题讨论】:

  • 在下面答案的Year 列上应用separate,然后使用spread,即df %&gt;% separate(Year, c("Year", "Part")) %&gt;% spread(Part, value)

标签: r tidyr


【解决方案1】:
library(tidyr)

# your example data
df <- data.frame(ID = 1:2, Year1_A = c('a', 'c'), Year1_B = c('b','d' ), Year2_A = c('2a', '2c'), Year2_B = c('2b', '2d'))

# the solution
df <- gather(df, Year, value, -ID)

# cleaning up
df$Year <- gsub("Year", "", df$Year)

结果:

> df
  ID Year value
1  1  1_A     a
2  2  1_A     c
3  1  1_B     b
4  2  1_B     d
5  1  2_A    2a
6  2  2_A    2c
7  1  2_B    2b
8  2  2_B    2d

【讨论】:

  • 完整的tidyverse,这看起来像df %&gt;% gather(Year, val, -ID) %&gt;% mutate(Year = sub('Year', '', Year))