整洁:创建没有 rowwise() 的键?
tidy: create key without rowwise()?
有没有不使用 rowwise()
就可以创建 key
的方法?
非常感谢任何指点。
df <- tibble(grp1=rev(LETTERS[1:5]),grp2=letters[11:15],grp3=LETTERS[1:5],
value=rnorm(5,10,10))
df %>% rowwise %>% mutate(key=paste(sort(c(grp1, grp2)), collapse="")) %>% ungroup()
grp1 grp2 grp3 value key
<chr> <chr> <chr> <chr> <chr>
1 E k A -3.73984194875213 AE
2 D l B 3.25846392371014 BD
3 C m C 3.62405652088127 CC
4 B n D 6.41520621902784 BD
5 A o E 20.1892413026407 AE
更新:tibble
包含多个字符向量,但 key
应该从列 grp1
和 grp3
生成。
使用 purrr::pmap_chr
:
library(tidyverse)
df %>% mutate(key=pmap_chr(.[c("grp1","grp3")],~paste(sort(c(...)), collapse="")))
# # A tibble: 5 x 5
# grp1 grp2 grp3 value key
# <chr> <chr> <chr> <chr> <chr>
# 1 E k A 22.0150932758833 AE
# 2 D l B 2.24725610156698 BD
# 3 C m C -6.2414882455089 CC
# 4 B n D 22.5699168856552 BD
# 5 A o E -6.21443670571301 AE
在基础 R 中你可以这样做:
transform(df, key=mapply(function(...) paste(sort(c(...)), collapse=""), grp1, grp3)
另一种方法是使用 mutate
,不使用 rowwise
,但使用矢量化版本的函数,如下所示:
library(dplyr)
# create a function and vectorise it
f = function(x, y) paste(sort(c(x, y)), collapse="")
f = Vectorize(f)
# use the function
df %>% mutate(key = f(grp1, grp3))
# # A tibble: 5 x 5
# grp1 grp2 grp3 value key
# <chr> <chr> <chr> <chr> <chr>
# 1 E k A -4.41213449814982 AE
# 2 D l B 10.4314736952111 BD
# 3 C m C 5.69345098226371 CC
# 4 B n D 4.39266020802413 BD
# 5 A o E 22.0623810028979 AE
这是一个使用 pmin/pmap
的向量化选项。将min/max
列的每一行'grp1'、'grp3'与pmin/pmax
连接在一起(str_c
)
library(dplyr)
library(stringr)
df %>%
mutate(key = str_c(pmin(grp1, grp3), pmax(grp1, grp3)))
# A tibble: 5 x 5
# grp1 grp2 grp3 value key
# <chr> <chr> <chr> <dbl> <chr>
#1 E k A 24.7 AE
#2 D l B 5.66 BD
#3 C m C 16.3 CC
#4 B n D 5.88 BD
#5 A o E -9.22 AE
数据
df <- tibble(grp1=rev(LETTERS[1:5]),grp2=letters[11:15],grp3=LETTERS[1:5],
value=rnorm(5,10,10))
注意:cbind
转换为 matrix
并且矩阵只能容纳一个 class。通过使用 as_tibble
转换为 tibble
不会自动更改 class。相反,直接使用 tibble/data.frame
而不是 cbind
route
有没有不使用 rowwise()
就可以创建 key
的方法?
非常感谢任何指点。
df <- tibble(grp1=rev(LETTERS[1:5]),grp2=letters[11:15],grp3=LETTERS[1:5],
value=rnorm(5,10,10))
df %>% rowwise %>% mutate(key=paste(sort(c(grp1, grp2)), collapse="")) %>% ungroup()
grp1 grp2 grp3 value key
<chr> <chr> <chr> <chr> <chr>
1 E k A -3.73984194875213 AE
2 D l B 3.25846392371014 BD
3 C m C 3.62405652088127 CC
4 B n D 6.41520621902784 BD
5 A o E 20.1892413026407 AE
更新:tibble
包含多个字符向量,但 key
应该从列 grp1
和 grp3
生成。
使用 purrr::pmap_chr
:
library(tidyverse)
df %>% mutate(key=pmap_chr(.[c("grp1","grp3")],~paste(sort(c(...)), collapse="")))
# # A tibble: 5 x 5
# grp1 grp2 grp3 value key
# <chr> <chr> <chr> <chr> <chr>
# 1 E k A 22.0150932758833 AE
# 2 D l B 2.24725610156698 BD
# 3 C m C -6.2414882455089 CC
# 4 B n D 22.5699168856552 BD
# 5 A o E -6.21443670571301 AE
在基础 R 中你可以这样做:
transform(df, key=mapply(function(...) paste(sort(c(...)), collapse=""), grp1, grp3)
另一种方法是使用 mutate
,不使用 rowwise
,但使用矢量化版本的函数,如下所示:
library(dplyr)
# create a function and vectorise it
f = function(x, y) paste(sort(c(x, y)), collapse="")
f = Vectorize(f)
# use the function
df %>% mutate(key = f(grp1, grp3))
# # A tibble: 5 x 5
# grp1 grp2 grp3 value key
# <chr> <chr> <chr> <chr> <chr>
# 1 E k A -4.41213449814982 AE
# 2 D l B 10.4314736952111 BD
# 3 C m C 5.69345098226371 CC
# 4 B n D 4.39266020802413 BD
# 5 A o E 22.0623810028979 AE
这是一个使用 pmin/pmap
的向量化选项。将min/max
列的每一行'grp1'、'grp3'与pmin/pmax
连接在一起(str_c
)
library(dplyr)
library(stringr)
df %>%
mutate(key = str_c(pmin(grp1, grp3), pmax(grp1, grp3)))
# A tibble: 5 x 5
# grp1 grp2 grp3 value key
# <chr> <chr> <chr> <dbl> <chr>
#1 E k A 24.7 AE
#2 D l B 5.66 BD
#3 C m C 16.3 CC
#4 B n D 5.88 BD
#5 A o E -9.22 AE
数据
df <- tibble(grp1=rev(LETTERS[1:5]),grp2=letters[11:15],grp3=LETTERS[1:5],
value=rnorm(5,10,10))
注意:cbind
转换为 matrix
并且矩阵只能容纳一个 class。通过使用 as_tibble
转换为 tibble
不会自动更改 class。相反,直接使用 tibble/data.frame
而不是 cbind
route