1

これは私の前の質問Merging vectors of strings in a list in Rのフォローアップです

を使用して別のアプローチを試みましたdata.table

私は次のようにdata.tableGを持っています

d <- list( c("SD1:LUSH", "SD44:CANCEL", "SD384:FR563", "SD32:TRUMPET"), c("SD23:SWITCH", "SD1:LUSH", "SD567:TREK"), c("SD42:CRAYON", "SD345:FOX", "SD183:WIRE"), c("SD345:HOLE", "SD340:DUST", "SD387:ROLL"), c("SD455:TOMATO", "SD39:MATURE"), c("SD12:PAINTING", "SD315:MONEY31", "SD387:SPRING"),  c("SD32:TRUMPET", "SD1:FIELD"))
d2 <-  lapply(d, function(x) sapply(strsplit(x, ":"), "[", 1))

d <- lapply(d, paste0, collapse=", ")
d2 <- lapply(d2, paste0, collapse=", ")

d <- as.data.frame(as.matrix(lapply(d, paste0, collapse=", ")))
d2 <- as.data.frame(as.matrix(lapply(d2, paste0, collapse=", ")))

d <- as.data.frame(cbind(d,d2))
colnames(d) <- c("sdw", "sd")
d$sd <- as.character(d$sd)
d$sdw <- as.character(d$sdw)



 G <- data.table( d , key = "sd" )
                                                sdw                     sd
1: SD1:LUSH, SD44:CANCEL, SD384:FR563, SD32:TRUMPET SD1, SD44, SD384, SD32
2:       SD12:PAINTING, SD315:MONEY31, SD387:SPRING     SD12, SD315, SD387
3:                SD23:SWITCH, SD1:LUSH, SD567:TREK       SD23, SD1, SD567
4:                          SD32:TRUMPET, SD1:FIELD              SD32, SD1
5:               SD345:HOLE, SD340:DUST, SD387:ROLL    SD345, SD340, SD387
6:               SD42:CRAYON, SD345:FOX, SD183:WIRE     SD42, SD345, SD183
7:                        SD455:TOMATO, SD39:MATURE            SD455, SD39

sd 列の要素に基づいて sdw 列の要素を集計しようとしています。

[1]、[2]、[7] はSD1共通です。したがって、対応する sdw 要素は一緒にマージする必要があります。また、[1]と[7]はSD1SD32共通です。

[4] は[3] と共通のSD345と [5] と共通のSD387を持っています。したがって、[4]、[3]、および [5] の sdw 要素は一緒にマージする必要があります。

[7] は、他のベクターと共通のSD__を持たないため、そのままにしておく必要があります。

要するに、 G$sd の重複するSD__用語に基づいて G$sdw 要素を集約したい

私が探している出力は次のとおりで、3行だけです。

[1] "SD1:LUSH, SD1:FIELD,  SD23:SWITCH, SD32:TRUMPET, SD44:CANCEL, SD384:FR563,  SD567:TREK"            
[2] "SD12:PAINTING, SD42:CRAYON, SD183:WIRE, SD340:DUST SD345:FOX, SD345:HOLE, SD387:SPRING, SD387:ROLL"
[3] "SD455:TOMATO, SD39:MATURE"

data.table私は次のようにパッケージを試しました

# Extract SDs from GN$sd
G <- G[ , list( ID = unlist( strsplit( sd , "," ) ) ) , by = list(sdw, sd) ]
G$ID <- gsub(" ", "", G$ID)
G <- data.table( G , key = "ID" )

# Merge according to common IDs
G2 <- G[, list(Gp1 = paste0(sort(unique(unlist(strsplit(sdw, split=", ")))), collapse=", "),
                           Gp2 = paste0(sort(unique(unlist(strsplit(sd, split=", ")))), collapse=", "))  , by = "ID"]

G2 <- data.table( G, key="Gp2")
G2 <- unique(G2)
G2

ID                                                                                  Gp1                                 Gp2
1:   SD1 SD1:FIELD, SD1:LUSH, SD23:SWITCH, SD32:TRUMPET, SD384:FR563, SD44:CANCEL, SD567:TREK SD1, SD23, SD32, SD384, SD44, SD567
2:  SD23                                                    SD1:LUSH, SD23:SWITCH, SD567:TREK                    SD1, SD23, SD567
3:  SD32                          SD1:FIELD, SD1:LUSH, SD32:TRUMPET, SD384:FR563, SD44:CANCEL              SD1, SD32, SD384, SD44
4: SD387       SD12:PAINTING, SD315:MONEY31, SD340:DUST, SD345:HOLE, SD387:ROLL, SD387:SPRING    SD12, SD315, SD340, SD345, SD387
5:  SD12                                           SD12:PAINTING, SD315:MONEY31, SD387:SPRING                  SD12, SD315, SD387
6: SD345               SD183:WIRE, SD340:DUST, SD345:FOX, SD345:HOLE, SD387:ROLL, SD42:CRAYON    SD183, SD340, SD345, SD387, SD42
7: SD183                                                   SD183:WIRE, SD345:FOX, SD42:CRAYON                  SD183, SD345, SD42
8: SD340                                                   SD340:DUST, SD345:HOLE, SD387:ROLL                 SD340, SD345, SD387
9:  SD39                                                            SD39:MATURE, SD455:TOMATO                         SD39, SD455

これは、G$sd の行全体でのSD__用語の重複に基づいてのみマージできます。要素間で複数の共通用語が考慮されておらず、同じ要素が他の要素と明確な共通用語を持っていることも考慮されていません。

で目的の出力を達成する方法はありますかR。私の完全なデータセットには、そのような行が何千もあります。

4

0 に答える 0