【问题标题】:How to re-arrange my dataframe in R [duplicate]如何在 R 中重新排列我的数据框 [重复]
【发布时间】:2018-07-18 07:07:06
【问题描述】:

我有 24 行数据和 2820 列。如何将这个大的水平表拆分为垂直表,每 60 列切割一次并将其堆叠在彼此下方:

这是 12 列和 6 行的示例图片:

之前:

之后:

【问题讨论】:

  • 寻求帮助时,您应该包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出
  • 对不起,我只是上传了一些例子来说明这个问题。谢谢。

标签: r dataframe reshape tabular


【解决方案1】:

我不确定我是否理解这个问题,但我认为您正在寻找的是 melt() 函数。这会将您的宽数据集转换为长数据集。话虽如此,我不知道你的意图是什么,所以我不确定数字 60 是否重要。

如果melt()是你想要的,你可以通过指定一个id变量来使用它,假设它的col1,其他的都会自动变成一个变量。如果您的表名为“x”:

col1  col2  col3  col4  ...
A     22     5    17
B     43     6    54
...

melt(x, id.vars = col1)

col1  variable  value
A     col2      22     
A     col3      5
A     col4      17
...

【讨论】:

  • 我不认为wide-long是这里的问题。我的理解是,他们只是想“切片”成 1-60、61-120...2761-2820 列,然后基本上将 rbind 这些切片放在一起。
  • 这是一件危险的事情,除非列首先没有独立的含义,在这种情况下,为什么它们不在同一列中开始?
  • 但我同意这听起来像是操作员的要求。
  • 是的,我想切表。并且列没有独立的意义。我将此表作为数据框。
  • 下面的答案适用于data.frame,就像matrix一样
【解决方案2】:

包括一个简化的示例,您可以执行以下操作:

# sample data
myMat <- matrix(rnorm(24*282), nrow = 24)

myList <- lapply(1:(282/6), function(x) myMat[, (6*(x-1)+1):(6*x)])

myNewMat <- do.call("rbind", args = myList)

dim(myNewMat)
## [1] 1128    6

【讨论】:

    【解决方案3】:

    @RolandASc 的答案的变体如下所示:

    mydf
    #   X_1      X_2  X_3 X_4 X_5      X_6  X_7 X_8 X_9     X_10  X_11 X_12
    # 1  A1 1/1/2016 2:30   5  D1 1/1/2017 5:30  15  A2 5/1/2016 12:30   50
    # 2  B1 1/2/2016 3:30   5  E1 1/2/2017 6:30  25  B2 5/2/2016 13:30  500
    # 3  C1 1/3/2016 4:30   8  F1 1/3/2017 7:30  80  C2 5/3/2016 14:30  800
    
    library(data.table)
    rbindlist(split.default(mydf, 0:(ncol(mydf)-1) %/% 4))
    #    X_1      X_2   X_3 X_4
    # 1:  A1 1/1/2016  2:30   5
    # 2:  B1 1/2/2016  3:30   5
    # 3:  C1 1/3/2016  4:30   8
    # 4:  D1 1/1/2017  5:30  15
    # 5:  E1 1/2/2017  6:30  25
    # 6:  F1 1/3/2017  7:30  80
    # 7:  A2 5/1/2016 12:30  50
    # 8:  B2 5/2/2016 13:30 500
    # 9:  C2 5/3/2016 14:30 800
    

    要为具有 2820 列的 data.frame 每 60 列执行一次,您可以使用以下方法创建拆分索引:

    0:(2820-1) %/% 60
    

    样本数据:

    mydf <- data.frame(
      X_1 = c("A1", "B1", "C1"), X_2 = c("1/1/2016", "1/2/2016", "1/3/2016"), 
      X_3 = c("2:30", "3:30", "4:30"), X_4 = c(5, 5, 8), 
      X_5 = c("D1", "E1", "F1"), X_6 = c("1/1/2017", "1/2/2017", "1/3/2017"), 
      X_7 = c("5:30", "6:30", "7:30"), X_8 = c(15, 25, 80), 
      X_9 = c("A2", "B2", "C2"), X_10 = c("5/1/2016", "5/2/2016", "5/3/2016"), 
      X_11 = c("12:30", "13:30", "14:30"), X_12 = c(50, 500, 800)
    )
    

    【讨论】:

      猜你喜欢
      • 2013-07-03
      • 2012-10-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-07
      • 2023-01-19
      • 1970-01-01
      • 2021-09-04
      相关资源
      最近更新 更多