如何在R中重新安排我的数据帧

时间:2018-02-07 21:02:17

标签: r dataframe reshape tabular

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

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

在:

Before

后:

After

3 个答案:

答案 0 :(得分:0)

我不确定我理解这个问题,但我认为你所寻找的是融合()函数。这会将您的宽数据集转换为长数据集。话虽如此,我不知道你的意图是什么,所以我不确定数字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
...

答案 1 :(得分:0)

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

# 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

答案 2 :(得分:0)

@ 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)
)