本节继续来介绍
tidyverse
中执行特殊功能的一些函数
- separate 1列变多列
- separate_rows 将折叠行展开
- unite 多列合并为1列
unite 多列合并
library(tidyverse)
library(magrittr)
iris %>% as_tibble() %>%
unite(.,col="Sepal",Sepal.Length:Sepal.Width,sep="|",
remove = T,na.rm = F)
Sepal Petal.Length Petal.Width Species
<chr> <dbl> <dbl> <fct>
1 5.1|3.5 1.4 0.2 setosa
2 4.9|3 1.4 0.2 setosa
unite 函数有5个参数
- col 设置合并后列的名称
- sep 指定分隔符
- remove 如果为TRUE,则从输出数据框中删除输入列
- na.rm 如果为TRUE,则在合并数据之前删除缺失值
上面的案例我们将2列合并成了1列,那么如果我们的数据有20列也需要2列合并为一列,此时该如何操作,请继续往下看
data <- iris %>% select_if(is.numeric)
result <- list(); b <- 2
for (i in 1:(data %>% ncol() / b)) {
result[[i]] <- data %>%
select((b * i - b + 1):(b * i) %>% all_of()) %>%
unite(.,A,sep="_",remove = T,na.rm = F)
}
df <- result %>% as.data.frame() %>%
set_colnames(c("Sepal","Petal")) %>% as_tibble()
df
Sepal Petal
<chr> <chr>
1 5.1_3.5 1.4_0.2
2 4.9_3 1.4_0.2
3 4.7_3.2 1.3_0.2
通过上面的for循环操作我们完成了数据的合并,这段代码还有别的用处,以后再一一介绍
sperate拆分列
df %>% separate(`Sepal`,into=c("A","B"),sep="_")
A B Petal
<chr> <chr> <chr>
1 5.1 3.5 1.4_0.2
2 4.9 3 1.4_0.2
3 4.7 3.2 1.3_0.2
只取分隔符前的列
df %>% separate(`Sepal`,into="Sepal",sep="_")
上面的只是一般的情况,实际中肯定有更复杂的需求,试想如果有多列需要拆分那该如果处理,请继续往下看
dt <- data.frame(Group = c(rep("A",5),rep("B",5)),
A1 = c(rep("A1_B",5),rep("B1_C",5)),
A2 = c(rep("A2_D",5),rep("B2_A",5)))
dt %>% as_tibble()
Group A1 A2
<chr> <chr> <chr>
1 A A1_B A2_D
2 A A1_B A2_D
3 A A1_B A2_D
4 A A1_B A2_D
dt %>%
mutate_at(vars(-Group),~str_split(.,"_",simplify=TRUE)[,2])
Group A1 A2
1 A B D
2 A B D
3 A B D
4 A B D
5 A B D
6 B C A
7 B C A
separate 参考案例
sparate_rows将折叠的行展开
示例1
df <- tibble(
x = 1:3,y = c("a", "d_e_f", "g_h"),
z = c("1", "2", "5"))
df
x y z
<int> <chr> <chr>
1 1 a 1
2 2 d_e_f 2
3 3 g_h 5
separate_rows(df,y, z,convert=TRUE,sep="_")
x y z
<int> <chr> <int>
1 1 a 1
2 2 d 2
3 2 e 2
4 2 f 2
5 3 g 5
6 3 h 5
示例2
d <- data.frame(a=c(1:3),
b=c("name1,name2,name3","name4","name5,name6"),
c=c("name7","name8,name9","name10"))
d
a b c
1 1 name1, name2, name3 name7
2 2 name4 name8, name9
3 3 name5, name6 name10
d %>% separate_rows(b) %>% separate_rows(c)
a b c
<int> <chr> <chr>
1 1 name1 name7
2 1 name2 name7
3 1 name3 name7
加入for循环
cols <- c("b", "c")
for(col in cols) {
d <- separate_rows_(d, col)
}
d
sparate_rows 参考案例
另外一种展开折叠行的方法
df %>% rowwise() %>%
mutate(y= y %>% strsplit(.,split = "_")) %>%
unnest_longer(col = y) %>% ungroup()
x y z
<int> <chr> <chr>
1 1 a 1
2 2 d 2
3 2 e 2
喜欢的小伙伴欢迎关注我的公众号
R语言数据分析指南,持续分享数据可视化的经典案例及一些生信知识,希望对大家有所帮助
网友评论