我试图转换当前格式为
的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无济于事。
答案 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
处理。
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
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
计算每行四倍的重复次数。