本節(jié)繼續(xù)來介紹
tidyverse中執(zhí)行特殊功能的一些函數(shù)
- 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 函數(shù)有5個參數(shù)
- col 設(shè)置合并后列的名稱
- sep 指定分隔符
- remove 如果為TRUE,則從輸出數(shù)據(jù)框中刪除輸入列
- na.rm 如果為TRUE,則在合并數(shù)據(jù)之前刪除缺失值
上面的案例我們將2列合并成了1列,那么如果我們的數(shù)據(jù)有20列也需要2列合并為一列,此時該如何操作,請繼續(xù)往下看
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循環(huán)操作我們完成了數(shù)據(jù)的合并,這段代碼還有別的用處,以后再一一介紹
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="_")
上面的只是一般的情況,實際中肯定有更復(fù)雜的需求,試想如果有多列需要拆分那該如果處理,請繼續(xù)往下看
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循環(huán)
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
喜歡的小伙伴歡迎關(guān)注我的公眾號
R語言數(shù)據(jù)分析指南,持續(xù)分享數(shù)據(jù)可視化的經(jīng)典案例及一些生信知識,希望對大家有所幫助