【发布时间】:2021-12-17 07:43:22
【问题描述】:
我正在尝试以两种不同的方式 melt 和 data.table。然后我最终不得不合并结果 - 这很尴尬,因为我有不同的 measure.vars,如果我有更宽的表/更复杂的列名,就无法扩展。
我从这个data.table开始:
id p1 p2 p1_pos p2_pos
1: 1 A F 0.70644404 0.75523969
2: 2 B G 0.96798381 0.26280453
3: 3 C H 0.35558517 0.45418777
4: 4 D I 0.14662296 0.01969177
5: 5 E J 0.45155647 0.41373110
6: 6 A F 0.81074292 0.19421395
7: 7 B G 0.49014540 0.02094569
8: 8 C H 0.01445689 0.20199638
9: 9 D I 0.80327645 0.73982715
10: 10 E J 0.17625955 0.88250913
接下来我继续融化两次并像这样合并:
dat = data.table(id = as.character(rep(1:10)),
p1 = rep(c("A", "B", "C", "D", "E"), 2),
p2 = rep(c("F", "G", "H", "I", "J"), 2),
p1_pos = runif(10),
p2_pos = runif(10))
first_melt = melt(dat, id.vars = "id",
measure.vars = c("p1", "p2"),
variable.name = "loc",
value.name = "name",
value.factor = F,
variable.factor = F)
second_melt = melt(dat,
id.vars = "id",
measure.vars = c("p1_pos", "p2_pos"),
variable.name = "loc",
value.name = "pos",
value.factor = F,
variable.factor = F)
second_melt[, loc := substr(loc, 1,2)]
result = merge(first_melt, second_melt, by = c("id", "loc"))
result[order(id)]
尴尬来自于需要合并的不同“measure.vars”。
这会产生预期的结果:
id loc name pos
1: 1 p1 A 0.70644404
2: 1 p2 F 0.75523969
3: 10 p1 E 0.17625955
4: 10 p2 J 0.88250913
5: 2 p1 B 0.96798381
6: 2 p2 G 0.26280453
7: 3 p1 C 0.35558517
8: 3 p2 H 0.45418777
9: 4 p1 D 0.14662296
10: 4 p2 I 0.01969177
11: 5 p1 E 0.45155647
12: 5 p2 J 0.41373110
13: 6 p1 A 0.81074292
14: 6 p2 F 0.19421395
15: 7 p1 B 0.49014540
16: 7 p2 G 0.02094569
17: 8 p1 C 0.01445689
18: 8 p2 H 0.20199638
19: 9 p1 D 0.80327645
20: 9 p2 I 0.73982715
我的问题是这些是否是一种更有效的方法(即在单个 melt 命令中)?还是我尽可能做到最好?
【问题讨论】:
-
您可以使用
measure,即setnames(dat, c('p1', 'p2'), c('p1_loc', 'p2_loc'));melt(dat, measure = patterns("_loc", "_pos"), value.name = c("name", "pos"), variable.name = 'loc')
标签: r data.table