Как изменить порядок столбцов после разделения?

У меня есть фрейм данных, содержащий список стран, и он был разделен с помощью функции csplit.

Код выглядит следующим образом: -

df <- data.frame(country = c("India, South Africa", "United Kingdom, United States, India",
                             "England, Australia, South Africa, Germany, United States"))
splitstackshape::cSplit(df, "country", sep = ", ")
 
#        country_1     country_2    country_3 country_4     country_5
#1:          India  South Africa         <NA>      <NA>          <NA>
#2: United Kingdom United States        India      <NA>          <NA>
#3:        England     Australia South Africa   Germany United States

Я хочу переставить столбцы таким образом, чтобы столбец country_1 содержал либо United States, либо <NA>. Аналогично для country_2 и country_3 это должно быть India или <NA> и United Kingdom или <NA> соответственно. Начиная с column_4 на стойках, он может следовать порядку в ряду.

Ожидаемый результат выглядит следующим образом:

#Expected Output
# country_1    country_2    country_3        country_4     country_5   country_6     country_7
#1 <NA>            India     <NA>            South Africa  <NA>        <NA>          <NA>
#2 United States   India     United Kingdom  <NA>          <NA>        <NA>          <NA>
#3 United States   <NA>      <NA>            England       Australia   South Africa  Germany

person Sri Sreshtan    schedule 08.07.2020    source источник


Ответы (1)


Очень уродливое решение с использованием apply:

df1 <- splitstackshape::cSplit(df, "country", sep = ", ")
n <- length(unique(na.omit(unlist(df1))))

as.data.frame(t(apply(df1, 1, function(x) {
      x1 <- rep(NA, n)
      if(any(x == 'United States', na.rm = TRUE)) x1[1] <- 'United States'
      if(any(x == 'India', na.rm = TRUE)) x1[2] <- 'India'
      if(any(x == 'United Kingdom', na.rm = TRUE)) x1[3] <- 'United Kingdom'
      temp <- setdiff(x, x1)
      if(length(temp)) x1[4:(4 + length(temp) - 1)] <- temp
      x1
})))

#             V1    V2             V3           V4        V5           V6      V7
#1          <NA> India           <NA> South Africa      <NA>         <NA>    <NA>
#2 United States India United Kingdom         <NA>      <NA>         <NA>    <NA>
#3 United States  <NA>           <NA>      England Australia South Africa Germany
person Ronak Shah    schedule 08.07.2020