извлечение уникальных валют в отдельные столбцы

#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