• R语言已解决
  • 一个重塑数据的问题,两次宽变长转换可否简化为一次到位?

如题,

# 原始数据
   type min_日月 min_星辰 max_日月 max_星辰
1:    A        1       38       48       42

# 第一次宽变长
  variable type2 type min max
1:        1  日月    A   1  48
2:        2  星辰    A  38  42

#  第二次宽变长
  type type2 variable value
1:    A  日月      min     1
2:    A  星辰      min    38
3:    A  日月      max    48
4:    A  星辰      max    42

这个问题可复现的代码如下。

library(data.table)
# 原始数据
data <- data.table(
  type = 'A',
  `min_日月` = 1,
  `min_星辰` = 38,
  `max_日月` = 48,
  `max_星辰` = 42
)
head(data)

# 第一次宽变长
data1 <- melt(
  data,
  id.vars = 'type',
  measure.vars = patterns('^min_', '^max_'),
  value.name = c('min', 'max'),
  variable.factor = FALSE
)
var <-
  data.table(variable = as.character(c(1:2)), type2 = c('日月', '星辰'))
data1 <- var[data1, on = 'variable']
head(data1)

# 第二次宽变长
data2 <-
  melt(data1,
       id.vars = c('type', 'type2'),
       measure.vars = c('min', 'max'))
head(data2)
df = data.frame(
  type = "A",
  min_日月 = 1, 
  min_星辰 = 38,
  max_日月 = 48,
  max_星辰 = 42
)

library(tidyr)
df %>% 
  pivot_longer(
    -type,
    names_to = c("variable", "type2"),
    names_sep = "_",
    values_to = "value"
  )