Dplyr Grouped Mutate 做替代?
Dplyr Grouped Mutate Do alternative?
我有一系列具有唯一帐号的帐户,可以按序号分组。我想使用每个序列开头的唯一帐号作为整个组的新参考列。我可以用 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
我们可以使用 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
我有一系列具有唯一帐号的帐户,可以按序号分组。我想使用每个序列开头的唯一帐号作为整个组的新参考列。我可以用 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
我们可以使用 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