Рассмотрим минимальный рабочий пример очень грязного набора данных, с которым я работаю:
library(dplyr)
library(tidyr)
x<- paste(sort(rep(LETTERS[1:4], 3)), paste0(rep("#", 3), rep(11:13, 3)))
y<- paste(sort(rep(LETTERS[1:4], 2)), paste0(rep(1:2, 2), rep("/0", 2)))
data<- data.frame(Item = c(x, y))
, что дает:
Item
1 A #11
2 A #12
3 A #13
4 B #11
5 B #12
6 B #13
7 C #11
8 C #12
9 C #13
10 D #11
11 D #12
12 D #13
13 A 1/0
14 A 2/0
15 B 1/0
16 B 2/0
17 C 1/0
18 C 2/0
19 D 1/0
20 D 2/0
Я хочу разделить пункт на элемент и размер. Есть два типа размеров. Первое, 11:13, которое обозначено #
. Второй, 1/0: 2/0, который может быть идентифицирован как /0
в этом примере. Для отделения первого типа размера от Item data %>% separate(Item, into = c("Item", "Size"), sep = "#")
используется. Это, однако, выводит NA
в строках 13:20.
Как можно отделить переменную в соответствии с условием, чтобы разделить элемент и размер второго типа размера?
Я попробовал приведенный ниже код, но безуспешно.
data %>%
separate(Item, into = c("Item", "Size"), sep = "#") %>%
mutate(ifelse(grepl("/0", Item) == TRUE, separate(Item, into = c("Item", "Size"), sep = " (?=[^ ]+$)", perl=TRUE), Size))
EDIT
Желаемый результат должен выглядеть следующим образом:
Item Size
1 A 11
2 A 12
3 A 13
4 B 11
5 B 12
6 B 13
7 C 11
8 C 12
9 C 13
10 D 11
11 D 12
12 D 13
13 A 1/0
14 A 2/0
15 B 1/0
16 B 2/0
17 C 1/0
18 C 2/0
19 D 1/0
20 D 2/0