【问题标题】:reshape wide to long using data.table with multiple columns使用具有多列的 data.table 将宽变长
【发布时间】:2018-06-24 04:50:31
【问题描述】:

我有一个宽格式的数据框,如下所示。我想使用 data.table 融化函数将宽变长。在简单的情况下,我可以拆分两个数据,并 rbind 两个数据集。但就我而言,有多个 test(i) testgr(i) 列。但必须有更好、更有效的方法来做到这一点。提前谢谢。

来自 =>

id<-c("106E1258","106E2037","104E1182","105E1248","105E1470","10241247",
"10241703")
yr<-c(2017,2017,2015,2016,2016,2013,2013)
finalgr<-c(72,76,75,71,75,77,78)
test01<-c("R0560","R0066","R0308","R0129","R0354","R0483",  
"R0503")
test01gr<-c(73,74,67,80,64,80,70)
test02<-c("R0660","R0266","R0302","R0139","R0324","R0383"   ,
"R0503")
test02gr<-c(71,54,67,70,68,81,61)
dt<-data.frame(id=id,yr=yr,
finalgr=finalgr,
test01=test01,test01gr=test01gr,
test02=test02,test02gr=test02gr)

到=>

id2<-c("106E1258","106E1258","104E1182","104E1182")
yr2<-c(2017,2017,2015,2015)
finalgr<-c(72,72,75,75)
testid<-c("R0560","R0660","R0308","R0302")
testgr<-c(73,71,67,67)
dt2<-data.frame(id=id2,yr=yr2,finalgr=finalgr,testid=testid,testgr=testgr)

【问题讨论】:

  • 你的例子看起来不完整?
  • 一般来说,避免在您的示例中命名 data.frame "dt" 可能是个好主意,因为大多数人都将其用作示例 data.table 名称。

标签: r data.table


【解决方案1】:

你确实应该使用melt

setDT(dt)
melt(dt, id.vars = c('id', 'yr', 'finalgr'), 
     measure.vars = list(testid = c('test01', 'test02'),
                         testgr = c('test01gr', 'test02gr')))
#           id   yr finalgr variable testid testgr
#  1: 106E1258 2017      72        1  R0560     73
#  2: 106E2037 2017      76        1  R0066     74
#  3: 104E1182 2015      75        1  R0308     67
#  4: 105E1248 2016      71        1  R0129     80
#  5: 105E1470 2016      75        1  R0354     64
#  6: 10241247 2013      77        1  R0483     80
#  7: 10241703 2013      78        1  R0503     70
#  8: 106E1258 2017      72        2  R0660     71
#  9: 106E2037 2017      76        2  R0266     54
# 10: 104E1182 2015      75        2  R0302     67
# 11: 105E1248 2016      71        2  R0139     70
# 12: 105E1470 2016      75        2  R0324     68
# 13: 10241247 2013      77        2  R0383     81
# 14: 10241703 2013      78        2  R0503     61

如果有更多的test 列,您可以使用patterns

melt(dt, id.vars = c('id', 'yr', 'finalgr'), 
     measure.vars = patterns(testid = 'test[0-9]+$', testgr = 'test[0-9]+gr'))

【讨论】:

  • 注意:根据this postdata.table::melt 不会猜测新variable 列中的因子名称。但是,该列中的值似乎与measure.vars 中组中的名称顺序相对应。因此,要获取名称,您可以使用 variable 添加一个新列,以按索引对名称进行子集:`dt[,names_column:=c('name1', 'name2')[variable]]
猜你喜欢
  • 2018-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多