【问题标题】:Reshape using columns as categories使用列作为类别重塑
【发布时间】:2021-10-20 15:48:14
【问题描述】:

用于重塑此数据框的任何 R 代码:

big small year
1 70.9 60.3 2000
2 70.7 40.4 2001
3 70.8 55.2 2002

到:

size values year
1 big 70.9 2000
2 small 60.3 2000
3 big 70.7 2001
4 small 40.4 2001
5 big 70.8 2002
6 small 55.2 2002

在base R中是否有一种巧妙的方法(如果不是包解决方案也可以)?

任何帮助表示感谢!

【问题讨论】:

  • 请检查tidyverse包(函数pivot_longer)或reshape2包。

标签: r dataframe reshape


【解决方案1】:

正如 OP 提到的base R 解决方案,这里有一个reshape

out <- reshape(df1, idvar = "year", direction = 'long',
    times = names(df1)[1:2], varying = list(1:2), timevar = "size", 
       v.names = "values")
row.names(out) <- NULL

-输出

> out
  year  size values
1 2000   big   70.9
2 2001   big   70.7
3 2002   big   70.8
4 2000 small   60.3
5 2001 small   40.4
6 2002 small   55.2

数据

df1 <- structure(list(big = c(70.9, 70.7, 70.8), small = c(60.3, 40.4, 
55.2), year = 2000:2002), class = "data.frame", row.names = c("1", 
"2", "3"))

【讨论】:

    【解决方案2】:

    您正在从dplyrpackage 中寻找pivot_longer() 函数

    library(dplyr)
    
    df %>% pivot_longer(cols=c('big', 'small'), names_to='size', values_to='values'))
    

    【讨论】:

      【解决方案3】:

      基本 R 选项

      > cbind(year = df$year, rev(stack(df[1:2])))[order(c(row(df[1:2]))),]
        year   ind values
      1 2000   big   70.9
      4 2000 small   60.3
      2 2001   big   70.7
      5 2001 small   40.4
      3 2002   big   70.8
      6 2002 small   55.2
      

      data.table 选项

      > setorder(melt(setDT(df), id.vars = "year"), "year")[]
         year variable value
      1: 2000      big  70.9
      2: 2000    small  60.3
      3: 2001      big  70.7
      4: 2001    small  40.4
      5: 2002      big  70.8
      6: 2002    small  55.2
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-22
        • 2020-08-19
        • 1970-01-01
        • 1970-01-01
        • 2017-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多