Dplyr Grouped Mutate Do альтернатива?

У меня есть ряд учетных записей с уникальными номерами счетов, которые можно сгруппировать по порядковому номеру. Я хотел бы использовать уникальный номер счета в начале каждой последовательности в качестве нового справочного столбца для всей группы. Я могу выполнить свою задачу с Do, но я думаю, что мое решение довольно неэлегантно. Может ли кто-нибудь с помощью этого примера кода продемонстрировать более чистый способ достижения результата?

library(tidyverse)

df <- tibble(Seq = factor(c(1,1,1,2,2,2,2,3,3)),
         Num = c("8432", "a2233", "234", 
                 "b532", "q265", "z4453", "1232", 
                 "a644", "124"))

df %>% 
   group_by(Seq) %>%
   do(mutate(.,HH = as_vector(.[1,2]))) %>%
   ungroup()

Выход:

    # A tibble: 9 × 3
     Seq   Num    HH
  <fctr> <chr> <chr>
1      1  8432  8432
2      1 a2233  8432
3      1   234  8432
4      2  b532  b532
5      2  q265  b532
6      2 z4453  b532
7      2  1232  b532
8      3  a644  a644
9      3   124  a644

person Farmer    schedule 19.02.2017    source источник
comment
Ваш код выдает ошибку. Какая у вас версия dplyr?   -  person akrun    schedule 19.02.2017
comment
0.5.0 Прошу прощения за это ... Я обновлю свою версию RStudio и исправлю.   -  person Farmer    schedule 19.02.2017
comment
Если вы можете обновить полученное решение, это будет здорово   -  person akrun    schedule 19.02.2017
comment
Возможно library(stringi); df %>% group_by(Seq) %>% mutate(HH = Num[stri_detect(Num, regex="[a-z]")])   -  person akrun    schedule 19.02.2017
comment
Я обновил Rstudio, запускаю Tidyverse 1.1.0 и не получаю сообщения об ошибке, я не уверен, почему он не будет работать для вас. Мне удалось скопировать приведенный выше код и запустить его без проблем. Строки, с которыми я работаю, не идентифицируются однозначно по наличию буквенно-цифровых символов ... Я структурировал их так, как в примере, для наглядности.   -  person Farmer    schedule 19.02.2017
comment
Не могли бы вы отредактировать свой пост с ожидаемым результатом, чтобы он стал более понятным (поскольку я не могу запустить ваш код). Также немного описания применяемой логики.   -  person akrun    schedule 19.02.2017


Ответы (1)


Мы можем использовать stri_match из stringi и создать столбец 'HH'

library(stringi)
df %>%
   group_by(Seq) %>% 
   mutate(HH = Num[which(stri_detect(Num, regex="[a-z]"))[1]])
#     Seq   Num    HH
#  <fctr> <chr> <chr>
#1      1  a432  a432
#2      1 a2233  a432
#3      1   234  a432
#4      2  b532  b532
#5      2  q265  b532
#6      2 z4453  b532
#7      2  1232  b532
#8      3  a644  a644
#9      3   124  a644

Или используя grep

df %>%
   group_by(Seq) %>% 
   mutate(HH = Num[grep("^[0-9]+$", Num, invert=TRUE)[1]])

Обновлять

Судя по новым обновленным данным, похоже, что мы хотели получить первый элемент Num.

df %>%
  group_by(Seq) %>%
  mutate(HH = first(Num))
#   Seq   Num    HH
#  <fctr> <chr> <chr>
#1      1  8432  8432
#2      1 a2233  8432
#3      1   234  8432
#4      2  b532  b532
#5      2  q265  b532
#6      2 z4453  b532
#7      2  1232  b532
#8      3  a644  a644
#9      3   124  a644
person akrun    schedule 19.02.2017
comment
К сожалению, этот код не работает, если ведущим символом является число. Я обновил пример кода, включив в него не-альфа-символ в качестве ведущего символа. Спасибо! - person Farmer; 20.02.2017
comment
@Farmer снова обновил пост. Я надеюсь у тебя нет новых правил - person akrun; 20.02.2017
comment
Спасибо за терпение и помощь. Приношу свои извинения за пример кода, который приводит к ложному предположению о шаблоне. Это прекрасно работает. - person Farmer; 20.02.2017