首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R:将(n*P) *N数据帧转换为n* (N*P)

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

Stack Overflow用户
提问于 2018-05-14 10:09:00
回答 1查看 60关注 0票数 1

我使用的是R,我有一个名为df的数据框架,它有(n*P)行和N列。

代码语言:javascript
复制
         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应该如下所示

代码语言:javascript
复制
       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行的重新绑定。df.new的下一个N列是df的第1-2、2-2、3-2、…、P-2行的重组.df.new的最后N列由df的第1-n、2-n、3-n、…、P行组成。(R1 of df.new是行1-1,1-2,.,1-n.R2 of df.new是2-1,2-2,.,2-n行的约束.df.new的Rn是P-1,P2,.,P-n.)

n,P和N是变量,因此它们的值取决于情况。我试图创建使用for循环的df.new,但是工作不太好。

这是我的尝试,我放弃了。

代码语言:javascript
复制
  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)
  }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-14 10:35:42

代码语言:javascript
复制
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")

输出是:

代码语言:javascript
复制
   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

样本数据:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50327823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档