【问题标题】:Reshape long format data to one line wide format data将长格式数据重塑为一行宽格式数据
【发布时间】:2017-07-19 16:34:30
【问题描述】:

我正在尝试将一些数据从长格式重塑为单行宽格式,以下是我的数据当前的外观;

id var1 var2 var3
1     a    b    c
2     d    e    f
3     g    h    i

下面是我希望我的数据在最后的样子;

id.1 var1.1 var2.1 var3.1 id.2 var1.2 var2.2 var3.2 id.3 var1.3 var2.3 var3.3
1         a      b      c    2      d      e      f    3      g      h      i

我尝试过使用tidyr 包和reshape,但似乎都无法完成我想做的事情。任何帮助将不胜感激。

【问题讨论】:

  • 我认为只有unlist(df) 可以满足您的需求(假设您没有任何因素并且您不关心订单)。或者c(t(df)) 将按所需顺序给出值,但没有名称。
  • 或者,我想do.call(cbind, split(mydf, 1:nrow(mydf))),但是为什么

标签: r reshape2 tidyr


【解决方案1】:

如果对维护列类型感兴趣,可以尝试do.call(cbind, split(mydf, 1:nrow(mydf)))

例子:

mydf <- structure(list(id = 1:3, var1 = structure(1:3, .Label = c("a",      
         "d", "g"), class = "factor"), var2 = c("b", "e", "h"), var3 = c("c",    
         "f", "i")), .Names = c("id", "var1", "var2", "var3"), row.names = c(NA, 
         3L), class = "data.frame")  

^^ 这就像您的数据,但“var1”列是一个因素。

do.call(cbind, split(mydf, 1:nrow(mydf)))
#   1.id 1.var1 1.var2 1.var3 2.id 2.var1 2.var2 2.var3 3.id 3.var1 3.var2 3.var3
# 1    1      a      b      c    2      d      e      f    3      g      h      i

str(.Last.value)
# 'data.frame': 1 obs. of  12 variables:
#  $ 1.id  : int 1
#  $ 1.var1: Factor w/ 3 levels "a","d","g": 1
#  $ 1.var2: chr "b"
#  $ 1.var3: chr "c"
#  $ 2.id  : int 2
#  $ 2.var1: Factor w/ 3 levels "a","d","g": 2
#  $ 2.var2: chr "e"
#  $ 2.var3: chr "f"
#  $ 3.id  : int 3
#  $ 3.var1: Factor w/ 3 levels "a","d","g": 3
#  $ 3.var2: chr "h"
#  $ 3.var3: chr "i"

^^ 注意列类是保留的。

一点点gsub 可以让列名符合您的预期。


或者,您可以添加两个额外的列,一个填充值“1”,另一个填充从 1 到数据集中行数的序列,并将其用作您的“id”(LHS)和“ time" (RHS) 变量与reshape 函数,或类似data.table 版本的dcast 接受多个变量value.var

【讨论】:

    【解决方案2】:

    【讨论】:

    • 不是评论吗?
    猜你喜欢
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    • 2021-05-01
    • 2021-09-15
    • 2022-01-11
    相关资源
    最近更新 更多