【发布时间】:2021-08-19 11:46:12
【问题描述】:
我有一个数据框 (data2),我想根据另一个选项卡 (data1) 中是否存在一些字符串来为其添加列 ("M1"、"M2"、"M3")。例如,对于“M1”值,如果该值与 data1 中的 M1 相关联,我想在 data2 中创建一个包含原始 TOT 值的列名称“M1”。 在某些情况下,我在 data2 中的值如下“t1;t4”,而我想在 data2 中比较的值是由 ; 分隔的。每一行。
为了更好地理解,下面有我想要的输出。
为了做到这一点,我尝试在包含所有模块值(“M1”...“M3”)的向量上创建一个循环,过滤该值的 data1,将相应的 GNE 值存储在向量中,并使用 mutate 函数在 data2 中添加列。我想知道如何在循环内用“M1”、“M2”或“M3”命名新列。
或者如果有人有更好的想法来使用另一种方法获得输出,我也会对我有用,因为我认为这不是最简单的方法。在我的真实数据中,我有 32 个新列要通过这种方式添加。
data1=data.frame(Module=c("M1", "M1", "M2", "M3", "M3", "M3", "M3"), GNE= c("t1", "t3", "t5", "t8", "t2", "t9", "t12"))
data2=data.frame(ID=c("A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9", "A10", "A11"), TOT=c("t1;t4", "t2", "t3", "t4", "t5", "t6", "t7", "t8;t9", "t9", "t10", "t8-8"))
list=c("M1", "M2", "M3")
> data1
Module GNE
1 M1 t1
2 M1 t3
3 M2 t5
4 M3 t8
5 M3 t2
6 M3 t9
7 M3 t12
> data2
ID TOT
1 A1 t1;t4
2 A2 t2
3 A3 t3
4 A4 t4
5 A5 t5
6 A6 t6
7 A7 t7
8 A8 t8;t9
9 A9 t9
10 A10 t10
11 A11 t8-8
for (a in list) {
data1_int=data1 %>% filter(Module=={{a}})
data1_int=data1_int$GNE
data2_int=data2 %>% mutate(New1 = map_chr(strsplit(TOT, ";"), ~ str_c(intersect(., data1_int), collapse = ";"))) %>% select(New1)
data2=cbind(data2, data2_int)
}
out=data2=data.frame(ID=c("A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9", "A10", "A11"),
TOT=c("t1;t4", "t2", "t3", "t4", "t5", "t6", "t7", "t8;t9", "t9", "t10", "t8-8"),
M1=c("t1", "", "t3", "", "", "", "", "", "", "", ""),
M2=c("", "", "", "", "t5", "", "", "", "", "", ""),
M3=c("", "t2", "", "", "", "", "", "t8;t9", "t9", "", ""))
ID TOT M1 M2 M3
1 A1 t1;t4 t1
2 A2 t2 t2
3 A3 t3 t3
4 A4 t4
5 A5 t5 t5
6 A6 t6
7 A7 t7
8 A8 t8;t9 t8;t9
9 A9 t9 t9
10 A10 t10
11 A11 t8-8
【问题讨论】: