【问题标题】:Reshape data from long to wide, with time in new wide variable name用新的宽变量名称将数据从长到宽重塑
【发布时间】:2011-03-20 05:30:34
【问题描述】:

我有一个数据框,我想从长格式合并到宽格式,但我想将时间嵌入到宽格式的变量名中。这是一个长格式的示例数据集:

id <- as.numeric(rep(1,16))
time <- rep(c(5,10,15,20), 4)
varname <- c(rep("var1",4), rep("var2", 4), rep("var3", 4), rep("var4", 4))
value <- rnorm(16)
tmpdata <- as.data.frame(cbind(id, time, varname, value))

> tmpdata
id time varname              value
1    5    var1  0.713888426169224
1   10    var1   1.71483653545922
1   15    var1  -1.51992072577836
1   20    var1  0.556992407683219
....
4   20    var4   1.03752019932467

我想要一个宽格式,输出如下:

id var1.5 var1.10 var1.15 var1.20 ....
1  0.71   1.71    -1.51   0.55 

(and so on)

我尝试在基础 R 中使用 reshape 函数但没有成功,我不确定如何使用 reshape 包来完成此操作,因为所有示例都将时间作为宽格式中的另一个变量。有任何想法吗?

【问题讨论】:

    标签: r


    【解决方案1】:

    这对于 reshape 包来说是微不足道的:

    library(reshape)
    cast(tmpdata, ... ~ varname + time)
    

    【讨论】:

    • 谢谢哈德利,您的代码完全符合我的要求。作为参考,我将 ... 替换为 id,以便在以后的示例中记住这一点。
    • 在此上下文中,... 表示未包含在演员表规范中的所有其他变量。除非您进行聚合,否则您不需要将其替换为实际的变量名称。
    【解决方案2】:

    我必须分两步完成reshape。行标题可能不是您所需要的,但可以轻松重命名。

    id <- as.numeric(rep(1, 16))
    time <- rep(c(5,10,15,20), 4)
    varname <- c(rep("var1",4), rep("var2", 4), rep("var3", 4), rep("var4", 4))
    value <- rnorm(16)
    tmpdata <- as.data.frame(cbind(id, time, varname, value))
    
    first <- reshape(tmpdata, timevar="time", idvar=c("id", "varname"), direction="wide")
    second <- reshape(first, timevar="varname", idvar="id", direction="wide") 
    

    还有输出:

    > tmpdata
       id time varname               value
    1   1    5    var1  -0.231227494628982
    2   1   10    var1   -1.80887236653438
    3   1   15    var1  -0.443229294431553
    4   1   20    var1    1.33719337048763
    5   1    5    var2   0.673109282347586
    6   1   10    var2   -0.42142267953938
    7   1   15    var2   0.874367622725874
    8   1   20    var2   -1.19917678039462
    9   1    5    var3    1.13495606258399
    10  1   10    var3 -0.0779385346672042
    11  1   15    var3  -0.126775240288037
    12  1   20    var3  -0.760739300144526
    13  1    5    var4   -1.94626587907069
    14  1   10    var4    1.25643195699455
    15  1   15    var4   -0.50986941213717
    16  1   20    var4   -1.01324846239812
    > first
       id varname            value.5            value.10           value.15
    1   1    var1 -0.231227494628982   -1.80887236653438 -0.443229294431553
    5   1    var2  0.673109282347586   -0.42142267953938  0.874367622725874
    9   1    var3   1.13495606258399 -0.0779385346672042 -0.126775240288037
    13  1    var4  -1.94626587907069    1.25643195699455  -0.50986941213717
                 value.20
    1    1.33719337048763
    5   -1.19917678039462
    9  -0.760739300144526
    13  -1.01324846239812
    > second
      id       value.5.var1     value.10.var1      value.15.var1    value.20.var1
    1  1 -0.231227494628982 -1.80887236653438 -0.443229294431553 1.33719337048763
           value.5.var2     value.10.var2     value.15.var2     value.20.var2
    1 0.673109282347586 -0.42142267953938 0.874367622725874 -1.19917678039462
          value.5.var3       value.10.var3      value.15.var3      value.20.var3
    1 1.13495606258399 -0.0779385346672042 -0.126775240288037 -0.760739300144526
           value.5.var4    value.10.var4     value.15.var4     value.20.var4
    1 -1.94626587907069 1.25643195699455 -0.50986941213717 -1.01324846239812
    

    【讨论】:

    • 您可能还想查看 Hadley Wickham 的 Reshape 包(我从未使用过)。
    • 谢谢你,richardh,你的解决方案有效,但我接受了使用 reshape 包的 Hadley 代码,因为新变量名称正是我想要的方式(var1_5、var1_10 等),无需额外的代码行重命名将变量名称转换为所需的格式。
    • @sheed03 -- 不用担心。哈德利的方式是做这件事的方式。但我注意到他改变了列的顺序(即,将时间 5 值放在最右边),所以一定要看看输出。
    【解决方案3】:

    两年前我放弃了旧的 reshape() 命令(不是 Hadley 的)。似乎每次都弄清楚这该死的事情实际上比仅仅用“硬”的方式更难,后者更灵活。

    您的示例中的数据都很好地排序。您可能必须先按变量名称和时间对真实数据进行排序。

    (将您的 tmpdata 重命名为 tmp,将值设为数字)

    y <- lapply(split(tmp, tmp$id), function(x) x$value)
    df <- data.frame(unique(tmp$id,), do.call(rbind,y))
    names(df) <- c('id', as.character(tmp$time:tmp$var))
    

    【讨论】:

      【解决方案4】:

      为什么不在重塑之前将 varname 和时间粘贴在一起?

      【讨论】:

        猜你喜欢
        • 2018-10-10
        • 2018-05-05
        • 2021-10-23
        • 1970-01-01
        • 1970-01-01
        • 2018-02-17
        • 2019-11-18
        相关资源
        最近更新 更多