原文链接:https://predictivehacks.com/tidyverse-tips/
tidyverse包对于数据处理非常有用,是个好的生产力工具。有些小窍门可以mark一下,以备日后使用。
(1) select_if|rename if
例子:如果你想在数据变量的列名前加前缀“numeric_”。
library(tidyverse)
iris%>%select_if(is.numeric, list(~ paste0("numeric_", .)))%>%head()
numeric_Sepal.Length numeric_Sepal.Width numeric_Petal.Length numeric_Petal.Width
1 5.1 3.5 1.4 0.2
2 4.9 3.0 1.4 0.2
3 4.7 3.2 1.3 0.2
4 4.6 3.1 1.5 0.2
5 5.0 3.6 1.4 0.2
6 5.4 3.9 1.7 0.4
可以用rename_if达到同样的目的。
(2)everything
有时候想让指定的列放到第一列或最后一列,可以用everything()来实现。例如:要让iris数据中Species放到数据的第一列:
mydataset<-iris%>%select(Species, everything())
mydataset%>%head()
Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1 setosa 5.1 3.5 1.4 0.2
2 setosa 4.9 3.0 1.4 0.2
3 setosa 4.7 3.2 1.3 0.2
4 setosa 4.6 3.1 1.5 0.2
5 setosa 5.0 3.6 1.4 0.2
6 setosa 5.4 3.9 1.7 0.4
放最后一列
mydataset%>%select(-Species, everything())%>%head()
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
(3)relocate
可以精确的把某一列放到另一列之前或之后。举例:把Petal.Width放到 Sepal.Width之后。
iris%>%relocate(Petal.Width, .after=Sepal.Width)%>%head()
Sepal.Length Sepal.Width Petal.Width Petal.Length Species
1 5.1 3.5 0.2 1.4 setosa
2 4.9 3.0 0.2 1.4 setosa
3 4.7 3.2 0.2 1.3 setosa
4 4.6 3.1 0.2 1.5 setosa
5 5.0 3.6 0.2 1.4 setosa
6 5.4 3.9 0.4 1.7 setosa
把Petal.Width放到最后
iris%>%relocate(Petal.Width, .after=last_col())%>%head()
Sepal.Length Sepal.Width Petal.Length Species Petal.Width
1 5.1 3.5 1.4 setosa 0.2
2 4.9 3.0 1.4 setosa 0.2
3 4.7 3.2 1.3 setosa 0.2
4 4.6 3.1 1.5 setosa 0.2
5 5.0 3.6 1.4 setosa 0.2
6 5.4 3.9 1.7 setosa 0.4
(4)pull
有时候我们用数据框,需要选择一列作为输出向量,可以用pull做到这一点。例子:如果想要用t.test比较两种鸢尾花setosa 和 virginica的Sepal.Length,可以这么做。
setosa_sepal_length<-iris%>%filter(Species=='setosa')%>%select(Sepal.Length)%>%pull()
virginica_sepal_length<-iris%>%filter(Species=='virginica')%>%select(Sepal.Length)%>%pull()
t.test(setosa_sepal_length,virginica_sepal_length)
data: setosa_sepal_length and virginica_sepal_length
t = -15.386, df = 76.516, p-value < 2.2e-16
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-1.78676 -1.37724
sample estimates:
mean of x mean of y
5.006 6.588
(5) reorder
用ggplot2的时候有时根据特定的条件排序某些因子让人沮丧。比如我们以Species来绘制Sepal.Width的箱线图:
iris%>%ggplot(aes(x=Species, y=Sepal.Width))+geom_boxplot()
假如以Species的中位数重新排序,可以用reorder()函数:
iris%>%ggplot(aes(x=reorder(Species,Sepal.Width, FUN = median), y=Sepal.Width))+geom_boxplot()+xlab("Species")
是不是很方便!!!