我有一个数据框,结构如下
ID Value1 Value2
1 a;d;g;f 12;14;15;9
2 b;c;e 5;18;20
3 h;i;j 6;7;25
所以我有一个ID和两个值,对于值1,有一个对应于值2的多个选项。我想最终得到以下数据帧,即值1的每个选项及其对应的值2
ID Value1 Value2
1 a 12
1 d 14
1 g 15
1 f 9
2 b 5
2 c 18
2 e 2
3 h 6
3 i 7
3 j 25
如何编写R来执行此操作?
答案 0 :(得分:4)
另一种选择是使用tstrsplit
的{{3}}中的data.table
library(data.table)
setDT(df)[, lapply(.SD, function(x) unlist(tstrsplit(x, ";", fixed=TRUE))), by = ID]
# ID Value1 Value2
# 1: 1 a 12
# 2: 1 d 14
# 3: 1 g 15
# 4: 1 f 9
# 5: 2 b 5
# 6: 2 c 18
# 7: 2 e 20
# 8: 3 h 6
# 9: 3 i 7
# 10: 3 j 25
答案 1 :(得分:3)
或者base
r(df1
从@akrun借来):
vals <- lapply(colnames(df1)[-1], function(col){strsplit(df1[, col], ";")})
names(vals) <- colnames(df1)[-1]
v_id <- mapply(rep, df1$ID, lapply(s_v1, length))
data.frame(ID=unlist(v_id), lapply(vals, unlist), stringsAsFactors=F)
# ID Value1 Value2
#1 1 a 12
#2 1 d 14
#3 1 g 15
#4 1 f 9
#5 2 b 5
#6 2 c 18
#7 2 e 20
#8 3 h 6
#9 3 i 7
#10 3 j 25