函数来自tidyr包,说明文档在tidyr,是一个很高级的基础R包,之前也没有怎么看过。有机会还说多学习一下。
三个函数的家族
separate函数
separate_wider_delim函数
separate_wider_position函数
功能主要是通过正则表达式,把一列拆分为多列;看看示例:
示例一
把一列拆两列
df <- tibble(x = c(NA, "x.y", "x.z", "y.z"))
> df
# A tibble: 4 × 1
x
<chr>
1 NA
2 x.y
3 x.z
4 y.z
df %>% separate(x, c("A", "B"))
# A tibble: 4 × 2
A B
<chr> <chr>
1 NA NA
2 x y
3 x z
4 y z
也可以只要两列中的一列
df %>% separate(x, c(NA, "B"))
# A tibble: 4 × 1
B
<chr>
1 NA
2 y
3 z
4 z
示例二
现在separate函数已经不再维护,推荐使用更明确的两个函数:
separate_wider_delim函数和separate_wider_position函数
可以看到separate_wider_delim指定了分隔符
df %>% separate_wider_delim(x, ".", names = c("A", "B"))
# A tibble: 4 × 2
A B
<chr> <chr>
1 NA NA
2 x y
3 x z
4 y z
不指定分隔符,separate_wider_position函数指定位置也可以达到类似效果
df <- tibble(id = 1:3, x = c("m-123", "f-455", "f-123"))
df %>% separate_wider_position(x, c(gender = 1, 1, unit = 3))
# A tibble: 3 × 3
id gender unit
<int> <chr> <chr>
1 1 m 123
2 2 f 455
3 3 f 123
示例三
可能会出现不均匀的数据分割,还会有warning
df <- tibble(x = c("x", "x y", "x y z", NA))
df %>% separate(x, c("a", "b"))
# A tibble: 4 × 2
a b
<chr> <chr>
1 x NA
2 x y
3 x y
4 NA NA
Warning messages:
1: Expected 2 pieces. Additional pieces discarded in 1 rows [3].
2: Expected 2 pieces. Missing pieces filled with `NA` in 1 rows [1].
可以扔了多余的,且不出现warning
df %>% separate(x, c("a", "b"), extra = "drop", fill = "right")
# A tibble: 4 × 2
a b
<chr> <chr>
1 x NA
2 x y
3 x y
4 NA NA
也可以保留最左侧多出来的部分
df %>% separate(x, c("a", "b"), extra = "merge", fill = "left")
# A tibble: 4 × 2
a b
<chr> <chr>
1 NA x
2 x y
3 x y z
4 NA NA
当然也可以把三个都拆分了
df %>% separate(x, c("a", "b", "c"))
# A tibble: 4 × 3
a b c
<chr> <chr> <chr>
1 x NA NA
2 x y NA
3 x y z
4 NA NA NA
Warning message:
Expected 3 pieces. Missing pieces filled with `NA` in 2 rows [1, 2].
示例四
想要根据冒号分割,但是冒号出现了两次,通过merge参数使得后面的字符串可以保留
df <- tibble(x = c("x: 123", "y: error: 7"))
> df %>% separate(x, c("key", "value"), ": ", extra = "merge")
# A tibble: 2 × 2
key value
<chr> <chr>
1 x 123
2 y error: 7