dcast - 使用列名连接列值

时间:2015-07-01 13:15:20

标签: r reshape2

我想将列值与列名连接以创建新列。我正在尝试使用库(reshape2),dcast但是我无法获得所需的输出。

是否有一种方法不涉及多次执行dcast,然后将结果集合回到一起?

当前数据框:

  observation=c(1,1,1,2,2,2,3,3,3)
  event=c('event1','event2','event3','event1','event2','event3','event1','event2','event3')
  value1=c(1,2,3,4,5,6,7,8,9)
  value2=c(11,12,13,14,15,16,17,18,19)
  current=data.frame(observation,event,value1,value2)
  current

必填数据框:

  observation=c(1,2,3)
  event1_value1 =c(1,4,7)
  event2_value1 =c(2,5,8)
  event3_value1 =c(3,6,9)
  event1_value2 =c(11,14,17)
  event2_value2 =c(12,15,18)
  event3_value2 =c(13,16,19)  
  required=data.frame(observation,event1_value1,event2_value1,event3_value1,event1_value2,event2_value2,event3_value2)
  required

下面的方法有效,但我觉得必须有更快的方法!

library(reshape2)    
value1 <-    dcast(current,observation~event,value.var ="value1")
value2 <-    dcast(current,observation~event,value.var ="value2")
merge(value1,value2,by="observation",suffixes = c("_value1","_value2"))

这是reshape from long to wide

的扩展

2 个答案:

答案 0 :(得分:4)

您可以使用data.table的devel版本,即v1.9.5,可以使用多个value.var列。安装devel版本的说明是here

library(data.table)#v1.9.5+
dcast(setDT(current), observation~event, value.var=c('value1', 'value2'))
#    observation event1_value1 event2_value1 event3_value1 event1_value2
#1:           1             1             2             3            11
#2:           2             4             5             6            14
#3:           3             7             8             9            17
#   event2_value2 event3_value2
#1:            12            13
#2:            15            16
#3:            18            19

reshape来自base R

reshape(current, idvar='observation', timevar='event', direction='wide')
#  observation value1.event1 value2.event1 value1.event2 value2.event2
#1           1             1            11             2            12
#4           2             4            14             5            15
#7           3             7            17             8            18
#  value1.event3 value2.event3
#1             3            13
#4             6            16
#7             9            19

答案 1 :(得分:2)

我不确定效率,但你可以试试这个 -


subjects : { [key: string] : { id: number; name: string; } } = <...>