Home > other >  CRAN/R: Concatenate a column into a list of string-pairs in the form "WX-YZ, AB-WX, AB-YZ"
CRAN/R: Concatenate a column into a list of string-pairs in the form "WX-YZ, AB-WX, AB-YZ"

Time:10-07

My dput is given below.

What I want to do: For every group (which is unique in the dataset), I'm trying to construct a new variable, say, countrypairlist, that lists all country PAIRS for each group. You'll see that that this desired information is implicitly contained in the above data in two separate ways.

First, the variable countries list all relevant countries for a particular group (e.g., for the first row, there's only one country, JP). Second, the dummy variables named after countries (e.g., the variable JP) == 1 if the name of that dummy variable is listed in the variable countries for a particular group, and == 0 otherwise.

Using either set of variables (whichever is easier and more computationally efficient), I want to create the countrypairlist that lists all country pairs, separated by ", ". For example, for group == 4253247, I'd need countrypairlist == LI-BE, LI-NL, BE-NL (order doesn't matter, so long as all pairs are listed). As another example, for group == 27439823, I'd need countrypairlist == DK-CH, DK-DE, CH-DE. countrypairlist can equal NA or 0 or any other placeholder when there is only one country in countries (or equivalently, when rowSum(over dummy variables) == 1.

What would be the most effective way to do this? Thank you!

structure(list(group = c(26344962L, 26947173L, 7681129L, 32322556L, 
27784632L, 34854057L, 37831629L, 37903977L, 38752541L, 35655241L, 
39744060L, 39864671L, 38513906L, 39829036L, 39768832L, 39682597L, 
39789349L, 40566389L, 39760845L, 39832290L, 39870577L, 40032764L, 
39743044L, 35519833L, 34609489L, 39734460L, 39744800L, 7672727L, 
32313557L, 34957472L, 39643836L, 39616295L, 4257105L, 26020976L, 
4253247L, 39410092L, 38187175L, 39204726L, 39294100L, 39294069L, 
39226773L, 39231044L, 39410460L, 39284069L, 27407686L, 10861963L, 
18556217L, 27481648L, 26068821L, 27439823L), countries = c("JP", 
"US", "DE", "NL", "JP", "DE", "DE", "DE", "DE", "DE", "DE", "DE", 
"DE", "DE", "DE, DD", "DE, US", "DE", "DE", "DE", "DE", "DE", 
"DE", "DE", "DE", "DE", "DE, AT", "DE, AT", "DE", "DE", "CH", 
"CH, DE", "AT", "CH, AT, US", "DE", "LI, BE, NL", "DE", "DE", 
"DE", "DE", "DE", "DE", "US, DE", "DE", "DE", "US, AU, FR", "NL, GB, US", 
"JP", "JP", "CH, SE, DK", "DK, CH, DE"), JP = c(1L, 0L, 0L, 0L, 
1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L), US = c(0L, 
1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 
0L), DE = c(0L, 0L, 1L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
0L, 1L, 0L, 0L, 1L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 
0L, 0L, 0L, 0L, 1L), NL = c(0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L), DD = c(0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), AT = c(0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 1L, 1L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L), CH = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
1L, 1L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 1L, 1L), LI = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), BE = c(0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), FR = c(0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 
0L), GB = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
1L, 0L, 0L, 0L, 0L), SE = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L), DK = c(0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L), AU = c(0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 
0L)), row.names = c(NA, 50L), class = "data.frame")

CodePudding user response:

You could do

library(tidyverse)

df %>%
  mutate(countrypairlist = sapply(strsplit(df$countries, ", "), function(x) {
    if(length(x) == 1) return(x)
    paste(apply(combn(x, 2), 2, paste, collapse = "-"), collapse = ";")
  })) %>%
  select(group, countries, countrypairlist)
#>       group  countries   countrypairlist
#> 1  26344962         JP                JP
#> 2  26947173         US                US
#> 3   7681129         DE                DE
#> 4  32322556         NL                NL
#> 5  27784632         JP                JP
#> 6  34854057         DE                DE
#> 7  37831629         DE                DE
#> 8  37903977         DE                DE
#> 9  38752541         DE                DE
#> 10 35655241         DE                DE
#> 11 39744060         DE                DE
#> 12 39864671         DE                DE
#> 13 38513906         DE                DE
#> 14 39829036         DE                DE
#> 15 39768832     DE, DD             DE-DD
#> 16 39682597     DE, US             DE-US
#> 17 39789349         DE                DE
#> 18 40566389         DE                DE
#> 19 39760845         DE                DE
#> 20 39832290         DE                DE
#> 21 39870577         DE                DE
#> 22 40032764         DE                DE
#> 23 39743044         DE                DE
#> 24 35519833         DE                DE
#> 25 34609489         DE                DE
#> 26 39734460     DE, AT             DE-AT
#> 27 39744800     DE, AT             DE-AT
#> 28  7672727         DE                DE
#> 29 32313557         DE                DE
#> 30 34957472         CH                CH
#> 31 39643836     CH, DE             CH-DE
#> 32 39616295         AT                AT
#> 33  4257105 CH, AT, US CH-AT;CH-US;AT-US
#> 34 26020976         DE                DE
#> 35  4253247 LI, BE, NL LI-BE;LI-NL;BE-NL
#> 36 39410092         DE                DE
#> 37 38187175         DE                DE
#> 38 39204726         DE                DE
#> 39 39294100         DE                DE
#> 40 39294069         DE                DE
#> 41 39226773         DE                DE
#> 42 39231044     US, DE             US-DE
#> 43 39410460         DE                DE
#> 44 39284069         DE                DE
#> 45 27407686 US, AU, FR US-AU;US-FR;AU-FR
#> 46 10861963 NL, GB, US NL-GB;NL-US;GB-US
#> 47 18556217         JP                JP
#> 48 27481648         JP                JP
#> 49 26068821 CH, SE, DK CH-SE;CH-DK;SE-DK
#> 50 27439823 DK, CH, DE DK-CH;DK-DE;CH-DE

Created on 2022-10-06 with reprex v2.0.2

  • Related