【问题标题】:Reshape R: split a column重塑 R:拆分列
【发布时间】:2013-09-08 18:19:17
【问题描述】:

一个非常简单的问题,但我找不到解决方案: 我有一个 data.frame 像

V1 <- c("A","A","B","B","C","C")
V2 <- c("D","D","E","E","F","F")
V3 <- c(10:15)
df <- data.frame(cbind(V1,V2,V3))

V1 V2 V3
A  D  10
A  D  11
B  E  12
B  E  13
C  F  14
C  F  15

我愿意

V1 V2 V3.1 V3.2
A  D   10   11
B  E   12   13
C  F   14   15

我尝试 reshape{stats} 和 reshape2

【问题讨论】:

    标签: r reshape


    【解决方案1】:

    正如我所提到的,你所需要的只是一个“时间”变量,你应该没问题。

    Mark Miller 展示了基本 R 方法,并手动创建了时间变量。

    这是一种自动创建时间变量的方法,以及“reshape2”包中dcast 的等效命令:

    ## Creating the "time" variable. This does not depend
    ##  on the rows being in a particular order before
    ##  assigning the variables
    df <- within(df, {
      A <- do.call(paste, df[1:2])
      time <- ave(A, A, FUN = seq_along)
      rm(A)
    })
    
    ## This is the "reshaping" step
    library(reshape2)
    dcast(df, V1 + V2 ~ time, value.var = "V3")
    #   V1 V2  1  2
    # 1  A  D 10 11
    # 2  B  E 12 13
    # 3  C  F 14 15
    

    自我推销提醒

    由于这种类型的问题已经出现了好几次,而且由于很多数据集并不总是有唯一的 ID,所以我在我的“splitstackshape”包中实现了上述的一个变体,作为一个名为getanID 的函数.在其当前版本中,它将“时间”变量的名称硬编码为“.id”。如果您使用它,步骤将是:

    library(splitstackshape)
    library(reshape2)
    df <- getanID(df, id.vars=c("V1", "V2"))
    dcast(df, V1 + V2 ~ .id, value.var = "V3")
    

    【讨论】:

    • @user2759357 Ananda 的回答更好。我所做的只是展示了一种实施他的建议的方法。
    • @Mark Miller:对,reshape 会创建不需要的属性,dcast 更优雅
    • @nebi,“优雅”真的很主观。如果@MarkMiller 还没有发布reshape 解决方案,我也会分享那个版本。 reshape 实际上是一个非常快的函数,并且非常适合它的设计用途,即处理纵向数据。
    【解决方案2】:
    V1 <- c("A","A","B","B","C","C")
    V2 <- c("D","D","E","E","F","F")
    V3 <- c(10:15)
    time <- rep(c(1,2), 3)
    df <- data.frame(V1,V2,V3,time)
    df
    
    reshape(df, idvar = c('V1','V2'), timevar='time', direction = 'wide')
    
      V1 V2 V3.1 V3.2
    1  A  D   10   11
    3  B  E   12   13
    5  C  F   14   15
    

    【讨论】:

      猜你喜欢
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-08
      • 2018-09-19
      • 2013-08-21
      • 1970-01-01
      相关资源
      最近更新 更多