R:将(n * P)* N数据帧转换为n *(N * P)

时间:2018-05-14 10:09:01

标签: r for-loop dataframe rbind cbind

我使用R而我有一个名为df的数据框,其中包含(n * P)行和N列。

         C1    C2 ... CN-1  CN
1-1     100    36 ...  136  76
1-2     120   -33 ...   87  42
1-3     150    14 ...  164  24
:
1-n      20    36 ...  136  76
2-1     109    26 ...  166  87
2-2     -33    87 ...   42  24
2-3     100    36 ...  136  76
:
2-n     100    36 ...  136  76
:
P-1     150    14 ...  164  24
P-2     100    36 ...  765  76
P-3     150    14 ...  164  94
:
P-n      10    26 ...  106  76

我想将此数据帧转换为具有n行和(N * P)列的数据帧。新数据框df.new应该看起来像

       C1-1  C2-1 ...   CN-1-1  CN-1  C1-2  C2-2  ...   CN-1-2   CN-2  ...  C1-P  C2-P ...   CN-1-P  CN-P
R1     100    36 ...      136    76    20    36  ...      136     76  ...  150    14  ...      164    24
R2     120   -33 ...       87    42   109    26  ...      166     87  ...  100    36  ...      765    76
:
:
Rn      20    36 ...      136    76   100    36  ...      136     76  ...   10    26   ...     106    76

也就是说,df.new的前N列是df的行1-1,2-1,3-1,......,P-1的rbind。接下来的df.new的N列是df的1-2,2-2,3-2,......,P-2行的rbind。它遵循df.new的最后N列,其将由df的行1-n,2-n,3-n,...,P-n行组成。 (df.new的R1是行1-1,1-2,...,1-n的cbind。df.new的R2是行2-1,2-2的cbind,... ,2-n。df.new的Rn是行P-1,P-2,...,Pn的cb。)

n,P和N是变量,因此它们的值取决于具体情况。我尝试使用for循环创建df.new,但效果不佳。有人有解决方案吗?非常感谢你。

这是我尝试过的尝试。

  for (j in 1:n) {
    df.new <- data.frame(matrix(vector(), 1, dim(df)[2],
                           dimnames = list(c(), colnames(df))),
                    stringsAsFactors=F)

    for (i in 1:nrow(df)) {
      if (i %% n == 0) {
        df.new <- rbind(df.new, df[i,])
      } else if (i %% n == j) {
      df.new <- rbind(df.new, df[i,])
      }
    }
    assign(paste0("df.new", j), df.new)
  }

1 个答案:

答案 0 :(得分:0)

希望这有帮助!

library(dplyr)
library(tidyr)
library(tibble)

df %>%
  rownames_to_column("rowname") %>%
  separate(rowname, c("rowname_prefix", "rowname_suffix"), "-") %>%
  gather(col_name, value, -rowname_prefix, -rowname_suffix) %>%
  mutate(col_name = paste(col_name, rowname_prefix, sep="-")) %>%
  select(-rowname_prefix) %>%
  spread(col_name, value) %>%
  mutate(rowname_suffix = paste0("R", rowname_suffix)) %>%
  column_to_rownames("rowname_suffix")

输出为:

   C1-1 C1-2 C1-3 C2-1 C2-2 C2-3 C3-1 C3-2 C3-3 C4-1 C4-2 C4-3
R1  100  109  150   36   26   14  136  166  164   76   87   24
R2  120  -33  100  -33   87   36   87   42  765   42   24   76
R3  150  100  150   14   36   14  164  136  164   24   76   94
R4   20  100   10   36   36   26  136  136  106   76   76   76

示例数据:

df <- structure(list(C1 = c(100L, 120L, 150L, 20L, 109L, -33L, 100L, 
100L, 150L, 100L, 150L, 10L), C2 = c(36L, -33L, 14L, 36L, 26L, 
87L, 36L, 36L, 14L, 36L, 14L, 26L), C3 = c(136L, 87L, 164L, 136L, 
166L, 42L, 136L, 136L, 164L, 765L, 164L, 106L), C4 = c(76L, 42L, 
24L, 76L, 87L, 24L, 76L, 76L, 24L, 76L, 94L, 76L)), .Names = c("C1", 
"C2", "C3", "C4"), class = "data.frame", row.names = c("1-1", 
"1-2", "1-3", "1-4", "2-1", "2-2", "2-3", "2-4", "3-1", "3-2", 
"3-3", "3-4"))
#     C1  C2  C3 C4
#1-1 100  36 136 76
#1-2 120 -33  87 42
#1-3 150  14 164 24
#1-4  20  36 136 76
#2-1 109  26 166 87
#2-2 -33  87  42 24
#2-3 100  36 136 76
#2-4 100  36 136 76
#3-1 150  14 164 24
#3-2 100  36 765 76
#3-3 150  14 164 94
#3-4  10  26 106 76