R:将 (n*P) * N 数据帧转换为 n * (N*P)
R: Transforming (n*P) * N data frame into n * (N*P)
我正在使用 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 行的 rbind,...,P-2。它一直跟到 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、...、P-n 行的 cbind。)
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)
}
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
我正在使用 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 行的 rbind,...,P-2。它一直跟到 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、...、P-n 行的 cbind。)
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)
}
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