Анализ на первом экземпляре набора значений

#r #parsing #csplit

Вопрос:

У меня есть фрейм данных в R следующим образом.

 test <- data.frame("FRUITSTRING" = c("APPLE_PEAR_BANANA",
                                     "TURNIP_CABBAGE_ORANGE_PEAR_BANANA",
                                     "APPLE_CARROT_PEAR_BANANA"), 
                   "SPLIT_CHAR" = c("PEAR","ORANGE","PEAR"))
 

Я хочу разделить строку с фруктами столбца на два столбца, но сделать так, чтобы она разделялась по строкам в зависимости от значения 2-го столбца, называемого SPLIT_CHAR. Возможно ли это сделать? Обратите внимание, что длина строки может измениться, и положение разделяемого символа может измениться, и именно поэтому я хочу вызвать определенный символ, чтобы выполнить разделение.

Функция, которую я использовал ранее, была cSplit, однако я понятия не имею, как передать этот фрейм данных в cSplit и использовать клапан другого столбца в качестве входа в csplit. Спасибо

Комментарии:

1. Что происходит с SPLIT_CHAR ним ? Это в конечном результате? И если да, то с какой стороны, 1-я часть новая FRUITSTRING или во 2-й?

Ответ №1:

1) dplyr/stsringr/tidyr Замените строку SPLIT_CHAR и окружающее _ точкой с запятой, а затем разделите на точку с запятой.

 library(dplyr)
library(stringr)
library(tidyr)

test %>%
  mutate(FRUITSTRING = str_replace(FRUITSTRING, str_c("_", SPLIT_CHAR, "_"), ";")) %>%
  separate(FRUITSTRING, c("prefix", "suffix"), sep = ";")
##           prefix      suffix SPLIT_CHAR
## 1          APPLE      BANANA       PEAR
## 2 TURNIP_CABBAGE PEAR_BANANA     ORANGE
## 3   APPLE_CARROT      BANANA       PEAR
 

2) База R — преобразование/sub или использование базы R. Извлеките префикс и отдельно извлеките суффикс, используя sub. Потому что нам нужна векторизованная версия sub, определенная в начале. Опустите последний аргумент transform, если необходимо сохранить ФРУКТОВУЮ строку.

 vsub <- Vectorize(sub)
transform(test,
 prefix = vsub(paste0("_", SPLIT_CHAR, "_.*"), "", FRUITSTRING),
 suffix = vsub(paste0(".*_", SPLIT_CHAR, "_"), "", FRUITSTRING),
 FRUITSTRING = NULL)
##   SPLIT_CHAR         prefix      suffix
## 1       PEAR          APPLE      BANANA
## 2     ORANGE TURNIP_CABBAGE PEAR_BANANA
## 3       PEAR   APPLE_CARROT      BANANA
 

2a) внутри/sub или то же самое, но с использованием внутри и немного другого шаблона регулярного выражения, чтобы мы могли использовать один и тот же для обоих экземпляров sub.

 vsub <- Vectorize(sub)
within(test, {
  pat <- paste0("(.*)_", SPLIT_CHAR, "_(.*)")
  suffix <- vsub(pat, "\2", FRUITSTRING)
  prefix <- vsub(pat, "\1", FRUITSTRING)
  FRUITSTRING <- pat <- NULL
})
##   SPLIT_CHAR         prefix      suffix
## 1       PEAR          APPLE      BANANA
## 2     ORANGE TURNIP_CABBAGE PEAR_BANANA
## 3       PEAR   APPLE_CARROT      BANANA
 

3) cSplit, как в (1), замените строку SPLIT_CHAR и окружающее _ точкой с запятой, а затем разделите на точку с запятой.

 library(splitstackshape)

test |>
  transform(FRUITSTRING = 
      Vectorize(sub)(paste0("_", SPLIT_CHAR, "_"), ";", FRUITSTRING)) |>
  cSplit("FRUITSTRING", sep = ";", type.convert = FALSE)
##    SPLIT_CHAR  FRUITSTRING_1 FRUITSTRING_2
## 1:       PEAR          APPLE        BANANA
## 2:     ORANGE TURNIP_CABBAGE   PEAR_BANANA
## 3:       PEAR   APPLE_CARROT        BANANA
 

Комментарии:

1. Большое спасибо за этот ответ. Очень признателен.