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