#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. Большое спасибо за этот ответ. Очень признателен.