Сделать функцию для сцепления в R - PullRequest
0 голосов
/ 12 апреля 2020

У меня есть такой фрейм данных:

Dis                           Area 
NAGAR,SANGANER                NAGAR,PRATAP NAGAR,SANGANER
NAGAR                         NAGAR,SODALA,BHANDARI
JHUNJHUNUN,BARI               BARI

Разделение данных с использованием sep ","

Новый фрейм данных (df1) выглядит следующим образом:

Dis        Dis1        Area  Area1  Area2  Area3
NAGAR      SANGANER    NAGAR PRATAP NAGAR SANGANER
NAGAR                  NAGAR SODALA BHANDARI
JHUNJHUNUN  BARI       BARI

Теперь я хочу объединить Dis с Area и другими, используя sep "|". Аналогично с Dis1 датафрейм будет выглядеть так: (желательно вывод)

Dis|Area         Dis1|Area        Dis|Area1           Dis1|Area1
NAGAR|NAGAR      SANGANER|NAGAR   NAGAR|PRATAP NAGAR  SANGANER|PRATAP NAGAR
NAGAR|NAGAR      |NAGAR           NAGAR|SODALA        |SODALA
JHUNJHUNUN|BARI  BARI|BARI        JHUNJHUNUN|         BARI|

и т. Д.

Как сделать функцию для этого. Для всех столбцов после разделения он автоматически объединяет их с другими столбцами.

1 Ответ

0 голосов
/ 12 апреля 2020

Не совсем понятно, как выглядят ваши начальные данные или конечный результат (см. Комментарий выше). Тем не менее, это может быть полезным для продвижения вперед.

Похоже, вы уже разбили столбцы через запятую. Вы можете объединить столбцы из «Dis» и «Area», создав фрейм данных с именами столбцов, которые необходимо объединить.

Затем можно использовать expand.grid для создания комбинации столбцов «Dis» и столбцов «Area». При желании это также можно обобщить, используя сами имена столбцов (начиная с «Dis» или «Area»).

Оператор sapply будет go через эту комбинацию пар имен столбцов и объединять соответствующие строки вместе.

Редактировать: Для каждой строки добавляется уникальная ссылка id.

library(tidyr)

df <- data.frame(
  id = c(1,2,3),
  Dis = c("NAGAR,SANGANER", "NAGAR", "JHUNJHUNUN,BARI"),
  Area = c("NAGAR,PRATAP NAGAR,SANGANER", "NAGAR,SODALA,BHANDARI", "BARI"),
  stringsAsFactors = F
)

df2 <- df %>%
  separate(Dis, into = paste0('Dis', 1:3), sep = ',') %>%
  separate(Area, into = paste0('Area', 1:3), sep = ',')

df2[is.na(df2)] <- ""

exp_cols <- expand.grid(names(df2)[2:4], names(df2)[5:7])

df_final <- cbind(df2$id, as.data.frame(sapply(1:nrow(exp_cols), function(x){
  do.call(paste, c(df2[, as.character(unlist(exp_cols[x,]))], sep=" | "))
})))

names(df_final) <- c("id", paste(exp_cols[,1], exp_cols[,2], sep = "_"))

Вывод

  id        Dis1_Area1       Dis2_Area1 Dis3_Area1           Dis1_Area2              Dis2_Area2      Dis3_Area2       Dis1_Area3          Dis2_Area3  Dis3_Area3
1  1     NAGAR | NAGAR SANGANER | NAGAR    | NAGAR NAGAR | PRATAP NAGAR SANGANER | PRATAP NAGAR  | PRATAP NAGAR NAGAR | SANGANER SANGANER | SANGANER  | SANGANER
2  2     NAGAR | NAGAR          | NAGAR    | NAGAR       NAGAR | SODALA                | SODALA        | SODALA NAGAR | BHANDARI          | BHANDARI  | BHANDARI
3  3 JHUNJHUNUN | BARI      BARI | BARI     | BARI        JHUNJHUNUN |                  BARI |               |     JHUNJHUNUN |              BARI |           | 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...