宽重复数据帧到长数据帧。

时间:2017-02-28 18:01:42

标签: r

我试图转换当前格式为

的csv文件

Name_A,Name_B,Value_A,Value_B,Name_A,Name_B,Value_A,Value_B .....重复约50次。

当读取R中的数据时,会转换重复的列名,如此

Name_A,Name_B,Value_A,Value_B,Name_A_1,Name_B_1,Value_A_1,Value_B_1

我希望它采用整齐的长格式,但无法弄清楚如何。我试过重塑和tidyr无济于事。

1 个答案:

答案 0 :(得分:0)

OP没有指定预期结果,因此我们疯狂猜测预期结果应该是什么样子。考虑两种可能性:

案例1

Name_A, Value_A,
Name_B, Value_B,
Name_A, Value_A,
Name_B, Value_B,
...

案例2

Name_A, Name_B, Value_A, Value_B
Name_A, Name_B, Value_A, Value_B
Name_A, Name_B, Value_A, Value_B
...

这两种情况均可由melt()包中的data.table处理。

案例1

library(data.table)
# read csv file
wide <- fread("wide.csv")
wide
#   Name_A Name_B Value_A Value_B Name_A Name_B Value_A Value_B
#1:     A1     B1     1.1     1.2     A2     B2     2.1     2.2
#2:     C1     D1     3.1     3.2     C2     D2     4.1     4.2

# reshape
long <- melt(wide, measure.vars = patterns("^Name_", "^Value_"), 
             value.name = c("Name", "Value"), variable.name = "col_group")
long
#   col_group Name Value
#1:         1   A1   1.1
#2:         1   C1   3.1
#3:         2   B1   1.2
#4:         2   D1   3.2
#5:         3   A2   2.1
#6:         3   C2   4.1
#7:         4   B2   2.2
#8:         4   D2   4.2

请注意,每行中名称 - 值对的重复都会计入col_group

输入数据

由于OP没有提供样本数据文件,因此创建了一个名为"wide.csv"的数据文件,其中包含以下内容:

Name_A, Name_B, Value_A, Value_B, Name_A, Name_B, Value_A, Value_B
A1, B1, 1.1, 1.2, A2, B2, 2.1, 2.2
C1, D1, 3.1, 3.2, C2, D2, 4.1, 4.2

添加行号

可以通过两种不同的方式添加行号。

第一个变体在融化之前将行号添加到wide

long <- melt(wide[, rn := seq_len(.N)], measure.vars = patterns("^Name_", "^Value_"), 
             value.name = c("Name", "Value"), variable.name = "col_group")
long[order(rn)]
#   rn col_group Name Value
#1:  1         1   A1   1.1
#2:  1         2   B1   1.2
#3:  1         3   A2   2.1
#4:  1         4   B2   2.2
#5:  2         1   C1   3.1
#6:  2         2   D1   3.2
#7:  2         3   C2   4.1
#8:  2         4   D2   4.2

第二个变体使用long函数在融化后将行号添加到rowid()

long <- melt(wide, measure.vars = patterns("^Name_", "^Value_"), 
             value.name = c("Name", "Value"), variable.name = "col_group")
long[, rn := rowid(col_group)]
long[order(rn)]
#   col_group Name Value rn
#1:         1   A1   1.1  1
#2:         2   B1   1.2  1
#3:         3   A2   2.1  1
#4:         4   B2   2.2  1
#5:         1   C1   3.1  2
#6:         2   D1   3.2  2
#7:         3   C2   4.1  2
#8:         4   D2   4.2  2

案例2

cols <- c("Name_A", "Name_B", "Value_A", "Value_B")
long <- melt(wide[, rn := seq_len(.N)], measure.vars = patterns(cols), 
             value.name = cols, variable.name = "col_group")
long[order(rn)]
#   rn col_group Name_A Name_B Value_A Value_B
#1:  1         1     A1     B1     1.1     1.2
#2:  1         2     A2     B2     2.1     2.2
#3:  2         1     C1     D1     3.1     3.2
#4:  2         2     C2     D2     4.1     4.2

此处,col_group计算每行四倍的重复次数。