Dplyr Grouped Mutate做其他选择吗?

时间:2017-02-19 05:07:02

标签: r dplyr tidyverse

我有一系列具有唯一帐号的帐户,可以按序列号分组。我想在每个序列的开头使用唯一的帐号作为整个组的新参考列。我可以用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

1 个答案:

答案 0 :(得分:3)

我们可以使用stri_match中的stringi并创建&#39; HH&#39;柱

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&#39;

的第一个元素
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