#r #dplyr
#r #dplyr
Вопрос:
У меня есть некоторые данные, которые выглядят так:
col
1 €€€€€
2 ££
3 €£
4 €€
5 €€€€€
6 €€€€
7 €€
8 €€
9 €€
10 €€
11 €€
12 €€
13 €€€€
14 €€€
15 €€€€
16 €€
17 €€
18 €€€€
19 $$
20 €€€CHF
Он содержит свернутый набор символов валюты разной длины. Что я хотел бы сделать, так это создать новый столбец и извлечь уникальные валюты. В большинстве случаев все валюты одинаковы, однако в строке 3 и строке 20 валюты выглядят как: €£
и €€€CHF
соответственно.
Ожидаемый результат:
col colCur1 colCur2
1 €€€€€ €
2 ££ £
3 €£ € £
4 €€ ...
5 €€€€€
6 €€€€
7 €€
8 €€
9 €€
10 €€
11 €€
12 €€
13 €€€€
14 €€€
15 €€€€
16 €€
17 €€
18 €€€€ ...
19 $$ $
20 €€€CHF € CHF
Данные:
structure(list(col = c("200200200200200", "££", "200£",
"200200", "200200200200200", "200200200200", "200200",
"200200", "200200", "200200", "200200", "200200", "200200200200",
"200200200", "200200200200", "200200", "200200", "200200200200",
"$", "200200200CHF")), class = "data.frame", row.names = c(NA,
-20L))
Комментарии:
1. Откуда вы знаете, что CHF — это валюта? Кажется, что все состоит из одного символа, за исключением этого и, предположительно, других, которые находятся за пределами вашего набора примеров. У вас есть список ссылок?
2. Я согласен с Адамом, идентификация отдельных валют — сложная часть. Если валюты представляют собой только один символ или 3 заглавные буквы, я полагаю, это может сработать.
Ответ №1:
Вот вариант
library(dplyr)
library(tidyr)
library(stringr)
df1 %>%
mutate(col2 = str_replace_all(col, "(.)\1 ", "\1"),
col2 = str_replace_all(col2, "([^A-Z])([^A-Z])", "\1,\2"),
col2 = str_replace_all(col2, "(?<=[^A-Z])(?=[A-Z])", ","),
col2 = strsplit(col2, ",")) %>%
unnest_wider(c(col2)) %>%
rename_at(-1, ~ str_c('colCur', seq_along(.)))
-вывод
# A tibble: 20 x 3
# col colCur1 colCur2
# <chr> <chr> <chr>
# 1 €€€€€ € <NA>
# 2 ££ £ <NA>
# 3 €£ € £
# 4 €€ € <NA>
# 5 €€€€€ € <NA>
# 6 €€€€ € <NA>
# 7 €€ € <NA>
# 8 €€ € <NA>
# 9 €€ € <NA>
#10 €€ € <NA>
#11 €€ € <NA>
#12 €€ € <NA>
#13 €€€€ € <NA>
#14 €€€ € <NA>
#15 €€€€ € <NA>
#16 €€ € <NA>
#17 €€ € <NA>
#18 €€€€ € <NA>
#19 $ $ <NA>
#20 €€€CHF € CHF