Увеличивайте аргумент end в str_sub до тех пор, пока мы не получим уникальные значения в dataframe - PullRequest
0 голосов
/ 03 апреля 2020

Вот мои игрушечные данные

df <- tibble::tribble(
        ~names,
        "apple alpha",
        "grapes beta",
        "orange gamma",
        'graphite alpha',
        "a bc",
        "apple gamma")

Вот пример кода:

df_1 <- df %>% 
  mutate(first_word = word(names),
         first_n_letters = str_sub(names, start = 1L, end = 4L) %>% str_trim(),
         small_name = if_else(nchar(first_word) > nchar(first_n_letters), first_word, first_n_letters))

Я хочу продолжать увеличивать конечный аргумент str_sub в приведенном выше коде до момента, когда

n_distinct(df_1 %>% select(small_name)) == nrow(df_1)

Другими словами, nchar (small_name) должен быть достаточно большим, чтобы в кадре данных не было повторяющегося small_name.

Таким образом, в этом случае итератор в l oop должен остановиться на 7, поскольку он предоставит уникальные значения small_name в df_1.

1 Ответ

1 голос
/ 03 апреля 2020

Вероятно, проще всего определить свою собственную функцию, чтобы сделать это:

shortest_unique <- function(x)
{
  n_uniq <- sapply(seq(max(nchar(x))), function(y) length(unique(substr(x, 1, y))))
  trimws(substr(x, 1, which.max(n_uniq)))
}

df %>% mutate(first_word = word(names), short_name = shortest_unique(names))
#> # A tibble: 6 x 3
#>   names          first_word short_name
#>   <chr>          <chr>      <chr>     
#> 1 apple alpha    apple      apple a   
#> 2 grapes beta    grapes     grapes    
#> 3 orange gamma   orange     orange    
#> 4 graphite alpha graphite   graphit   
#> 5 a bc           a          a bc      
#> 6 apple gamma    apple      apple g

Создано в 2020-04-03 пакетом prex (v0.3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...