【问题标题】:dcast - concatenate column values with column names [duplicate]dcast - 将列值与列名连接起来[重复]
【发布时间】:2015-07-01 13:15:20
【问题描述】:

我想将列值与列名连接起来以创建新列。我正在试验 library(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的扩展

【问题讨论】:

    标签: r reshape2


    【解决方案1】:

    您可以使用data.table 的开发版本,即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
    

    【讨论】:

    • 感谢 akrun,我认为不采用多个 value.var 列是 dcast 的一个限制。我很高兴正在添加该功能!
    • @Chris 最近添加的。另外,您可以在开发版本中查看?melt,它具有类似类型的反向功能。
    【解决方案2】:

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

    > dcast(melt(current,id.vars = c('observation','event')),observation~event+variable)
      observation event1_value1 event1_value2 event2_value1 event2_value2 event3_value1 event3_value2
    1           1             1            11             2            12             3            13
    2           2             4            14             5            15             6            16
    3           3             7            17             8            18             9            19
    

    【讨论】:

    • 你可以把它包装成recast
    • 我不知道这存在。我们每天都在学习。谢谢!
    • 谢谢,这也有效。我将看看不同方法在更大的数据帧上的比较。
    • @Chris data.table 方法将总是获胜。你可以确定这一点。与data.table 的开发版本相比,reshape2 方法的优势在于它在 cran 上使用了稳定版本。它应该比基本的reshape 方法更快。尽管data.table v 1.9.6 现在应该随时发布。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-08
    相关资源
    最近更新 更多