【问题标题】:create multiple variable/value columns with melt - R [duplicate]使用熔体创建多个变量/值列 - R [重复]
【发布时间】:2020-03-25 10:58:50
【问题描述】:
> df <- data.frame(g=c(1,2,3,1,2,3), foo_x=c(12,32,14,23,12,34), foo_y=c(32,35,12,12,32,34), bar_x=c(100,233,122,433,122,442), bar_y=c(744,546,236,137,652,235))

我正在尝试创建这个数据框:

g  foo  bar val_foo  val_bar
1   x    x     12      100
2   x    x     32      233
3   x    x     14      122
1   x    y     32      744
2   x    y     35      546
3   x    y     12      236
1   y    x     23      433
2   y    x     12      122
3   y    x     34      442
1   y    y     12      137
2   y    y     32      652
3   y    y     34      235

我想我应该使用melt 函数,但是如何创建两个不同的变量(foobar)和值(val_fooval_bar)列? melt(df, id.vars="g") 只创建一个变量/值对。

【问题讨论】:

  • foobar 列的名称与您的 iiput 不一致
  • 很多相关的想法here

标签: r reshape melt


【解决方案1】:

我们可以对多组列使用pivot_longer

library(dplyr)
library(tidyr)
df %>%
   pivot_longer(cols = -g, names_to = c(".value", "grp"), names_sep="_")

或与melt 来自data.table

library(data.table)
melt(setDT(df), measure = patterns("^foo", "^bar"), 
      value.name = c("val_foo", "val_bar"))

或者正如@markus 提到的base R

reshape(df, idvar = "g", varying = list(2:3, 4:5), sep = "_",
    direction = "long", v.names = c("val_foo", "val_bar"), new.row.names = 1:12) 

【讨论】:

  • 完成三位一体:reshape(df, idvar = "g", varying = list(2:3, 4:5), sep = "_", direction = "long", v.names = c("val_foo", "val_bar"), new.row.names = 1:12)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-09
  • 2017-05-24
  • 2022-01-22
  • 2015-03-21
  • 1970-01-01
  • 2021-12-05
  • 2021-12-14
相关资源
最近更新 更多