【问题标题】:Dplyr Grouped Mutate Do alternative?Dplyr Grouped Mutate 做替代品吗?
【发布时间】:2017-02-19 05:07:01
【问题描述】:

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

【问题讨论】:

  • 您的代码出错。你有哪个版本的dplyr
  • 0.5.0 对此表示歉意...我将更新我的 RStudio 版本并更正。
  • 如果你能用你得到的解决方案进行更新,那就太好了
  • 或许library(stringi); df %&gt;% group_by(Seq) %&gt;% mutate(HH = Num[stri_detect(Num, regex="[a-z]")])
  • 我更新了 Rstudio 并正在运行 Tidyverse 1.1.0 并且没有收到错误,我不确定为什么它不会为你运行。我能够复制上面的代码并毫无问题地运行它。我正在使用的字符串不是由字母数字的存在唯一标识...我在示例中的结构是为了视觉参考。

标签: r dplyr tidyverse


【解决方案1】:

我们可以使用stringi 中的stri_match 并创建“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

【讨论】:

  • 不幸的是,如果前导字符是数字,则该代码不起作用。我更新了示例代码以包含一个非字母字符作为前导字符。谢谢!
  • @Farmer 再次更新了帖子。我希望你没有任何新规则
  • 感谢您的耐心和帮助。对于导致虚假模式假设的示例代码,我深表歉意。这非常有效。
猜你喜欢
  • 1970-01-01
  • 2017-04-30
  • 1970-01-01
  • 2018-03-16
  • 1970-01-01
  • 2018-06-24
  • 1970-01-01
  • 2011-03-17
  • 2011-07-17
相关资源
最近更新 更多