library(dplyr)
13 介绍
dplyr
是一个R语言包,它提供了一组用于进行数据操作和转换的函数。下面是一些dplyr
包中常用的函数及其作用:
select()
: 选择列mutate()
: 创建新的计算变量filter()
: 根据条件选择行group_by()
: 按照指定的列对数据进行分组summarize()
: 计算每组数据的摘要统计量arrange()
: 按照指定的列排序distinct()
: 选择唯一的行join()
: 将多个表格合并成一个表格union()
: 将两个表格合并为一个表格(类似于SQL中的UNION)intersect()
: 取两个表格的交集(类似于SQL中的INTERSECT)anti_join()
: 取两个表格的差集(类似于SQL中的EXCEPT)
13.1 示例数据
<-data.frame(x=-2:3,y=1:6,a=rep(c('A','B'),each=3))
data data
13.2 select()
select()
是dplyr
包中的一个函数,它用于选择数据框中的特定列。例如,假设你有一个名为data
的数据框,其中包含多列,你可以用以下代码选择列x
和列y
:
select(data, x, y)
在这个例子中,select()
函数会返回一个新的数据框,其中只包含原来数据框中的列x
和列y
。你也可以使用通配符来选择多个列。例如:
select(data, starts_with("x"))
这里的starts_with()
函数会匹配所有以x
开头的列名,例如x1
、x2
等,然后select()
函数会返回一个新的数据框,其中包含原数据框中所有以x
开头的列。
除了选择列,你还可以用select()
函数来排除列。例如:
select(data, -x)
这里,我们使用了负号(-
)来排除列x
,select()
函数会返回一个新的数据框,其中包含原数据框中除列x
以外的所有列。
你也可以使用类似的方式来排除多个列,例如:
select(data, -starts_with("x"))
这里,我们使用了starts_with()
函数来匹配所有以x
开头的列名,然后用负号排除这些列。select()
函数会返回一个新的数据框,其中包含原数据框中除了以x
开头的列以外的所有列。
除了使用函数来选择或排除列,你还可以使用类似于SQL中的语法来指定要选择或排除的列。例如:
select(data, x, y, -a)
这里,我们指定了要选择列x
和列y
,并使用负号排除列a
。select()
函数会返回一个新的数据框,其中包含原数据框中的列x
、列y
,除列a
以外的所有列。
13.2.1 选择器函数有哪些
在 tidyverse
语法中,有多种选择器函数可以用来选择数据框中的特定列。这些选择器函数主要有如下几种:
starts_with()
:选择名称以某个字符串开头的列。ends_with()
:选择名称以某个字符串结尾的列。contains()
:选择名称中包含某个字符串的列。matches()
:选择名称与某个正则表达式相匹配的列。one_of()
:选择名称在指定列表中出现过的列。everything()
:选择所有列。
<-data.frame(age=1:3) %>%
my_datamutate(age1=age,age2=age,Age1=age,new_age=age,new_age_old=age,
chr_age=as.character(age))
my_data
例如,如果您想要选择 my_data
数据框中名称以 age
开头的列,可以使用如下语句:
%>% select(starts_with("age")) my_data
这条语句的意思是,在 my_data
数据框中选择名称以 age
开头的列,并将结果保存到变量 my_data_selected
中。
如果您想要选择 my_data
数据框中名称以 age
结尾的列。
如果您想要选择 my_data
数据框中名称以 age
结尾的列,可以使用如下语句:
%>% select(ends_with("age")) my_data
如果您想要选择 my_data
数据框中名称中包含 age
的列,可以使用如下语句:
%>% select(contains("age")) my_data
如果您想要选择 my_data
数据框中名称与正则表达式 "a.e"
相匹配的列,可以使用如下语句:
%>% select(matches("a.e")) my_data
如果您想要选择 my_data
数据框中名称在列表 c("age", "height")
中出现过的列,可以使用如下语句:
%>% select(one_of(c("age", "height"))) my_data
Warning: Unknown columns: `height`
如果您想要选择 my_data
数据框中的所有列,可以使用如下语句:
%>% select(everything()) my_data
13.2.2 其他的选择器函数
除了以上提到的选择器函数,tidyverse
语法中还有一些其他选择器函数可以用来选择数据框中的特定列。例如,还有以下几种常用的选择器函数:
num_range()
:选择名称在指定数字范围内的列。where()
:选择满足某个条件的列。
例如,如果您想要选择 my_data
数据框中名称在数字范围 [1,5] 内的列,可以使用如下语句:
%>% select(num_range(1, 5)) my_data
%>% select(where(is.numeric)) my_data
%>% select(where(is.character)) my_data
13.2.3 match选择器函数中的正则表达式
在 match()
选择器函数中,您可以使用正则表达式来匹配列名。正则表达式的语法与 R 语言的其他用法相同,详细内容可以参考 R 语言的官方文档。
13.3 mutate()
mutate()
是dplyr
包中的一个函数,用于创建新的计算变量。例如,假设你有一个名为data
的数据框,其中包含一列名为x
和一列名为y
,你可以用以下代码创建一个新的列z
,其值为x
和y
的和:
mutate(data, z = x + y)
你可以用类似的方式创建其他任何计算变量。例如,你可以根据条件创建一个分类变量:
mutate(data, group = ifelse(x > 0, "positive", "negative"))
另外,你也可以在mutate()
函数中使用其他函数,例如聚合函数或统计函数,来对原数据进行处理。例如,你可以计算每个x
值的均值和标准差:
mutate(data,
x_mean = mean(x),
x_sd = sd(x)
)
你还可以使用group_by()
函数来根据指定的列对数据进行分组,然后在每组中应用mutate()
函数,以便为每个组分别计算新的变量。例如:
group_by(data, a) %>%
mutate(
x_mean = mean(x),
x_sd = sd(x)
)
13.4 filter()
filter()
是dplyr
包中的一个函数,它用于根据指定的条件选择数据框中的行。例如,假设你有一个名为data
的数据框,其中包含多行多列,你可以用以下代码选择值大于0的行:
filter(data, x > 0)
在这个例子中,filter()
函数会返回一个新的数据框,其中只包含原数据框中值大于0的行。你也可以使用多个条件来进行筛选。例如:
filter(data, x > 0, y < 5)
这里,filter()
函数会返回一个新的数据框,其中只包含原数据框中值大于0且值小于5的行。
除了简单的条件判断,你还可以在filter()
函数中使用复杂的逻辑表达式来进行筛选。例如:
filter(data, x > 0 & y < 5 | a == 'B')
这里,我们使用了与(&
)、或(|
)以及等于(==
)符号来构造复杂的逻辑表达式,filter()
函数会返回一个新的数据框,其中只包含原数据框中符合
13.5 group_by()
<-data.frame(
my_dataid=1:6,
age=3:4,
sex=rep(c('Female','Male'),each=3),
los=runif(6,3,10) %>% round()
) my_data
group_by()
是 dplyr包中的一个函数,它能够将数据按照指定的条件进行分组。通常,我们使用 group_by()
函数将数据按照某个变量的值进行分组,然后再对每个分组进行进一步的操作。
例如,假设我们有一个数据框 my_data
,如果我们想要将数据框 my_data
按照 age
变量的值进行分组,可以使用如下语句:
<- group_by(my_data, age) my_data_grouped
这条语句的意思是,使用 group_by()
函数将数据框 my_data
按照 age
变量的值进行分组,并将结果保存到变量 my_data_grouped
中。
接下来,我们可以对每个分组进行进一步的操作。例如,如果我们想要计算每个分组中 los
变量的平均值,可以使用 summarise()
函数来实现:
summarise(
my_data_grouped, mean_nlos = mean(los))
13.5.1 多级分组
当然,您也可以使用 group_by()
函数进行多级分组。例如,如果您想要将数据框 my_data
按照 age
和 sex
两个变量的值进行多级分组,可以使用如下语句:
%>%
my_data group_by(age, sex) %>%
summarise(mean=mean(los),median=median(los))
`summarise()` has grouped output by 'age'. You can override using the `.groups`
argument.
13.5.2 重新分组
%>%
my_data group_by(age) %>%
group_by(sex) %>% #重新分组
summarise(mean=mean(los),median=median(los))
13.5.3 取消分组
如果您想要取消分组,可以使用 ungroup()
函数。例如,假设您已经将数据框 my_data
按照 age
变量的值进行分组,并将结果保存到变量 my_data_grouped
中,如果您想要取消分组,可以使用如下语句:
%>%
my_data group_by(age) %>%
ungroup() %>%
summarise(mean=mean(los),median=median(los))
取消分组后,数据框会恢复到未分组的状态。
13.6 summarise()
summarise()
是dplyr
包中的一个函数,它用于对数据框进行汇总。例如,假设你有一个名为data
的数据框,其中包含多行多列,你可以用以下代码计算每个组的均值:
group_by(my_data, sex) %>%
summarise(mean = mean(los))
在这个例子中,我们首先使用group_by()
函数将数据框按照列sex
进行分组,然后使用summarise()
函数计算每个组的均值。summarise()
函数会返回一个新的数据框,其中包含每个组的均值以及对应的组名。
除了计算均值,你还可以使用summarise()
函数计算其他统计量,例如求和、求最大值求最小值等。例如:
group_by(my_data, sex) %>%
summarise(sum = sum(los),
max = max(los),
min = min(los))
13.7 distinct()
distinct()
函数是 tidyverse
包中的一个函数,用于选择指定数据框中不同的行。例如,如果您想要从 my_data
数据框中选择出不同的行,可以使用如下语句:
%>% distinct(sex,.keep_all = T) my_data
这条语句的意思是,在 my_data
数据框中选择出不同的行,并将结果保存到变量 my_data_distinct
中。
除了上述语句,您还可以使用 distinct()
函数指定选择哪些列来检查行的唯一性。例如,如果您想要仅以 age
列为依据来选择不同的行,可以使用如下语句:
%>% distinct(age) my_data
这条语句的意思是,在 my_data
数据框中选择出不同的行,并仅以 age
列为依据来检查行的唯一性。由于这条语句只检查了 age
列,所以如果两行中 age
列的值相同,那么这两行都会被认为是重复的,只会保留一行。最终的结果会被保存到变量 my_data_distinct
中。
另外,您还可以使用 distinct()
函数中的 .keep_all
参数来指定是否保留所有列。例如,如果您想要保留所有列,可以使用如下语句:
%>% distinct(sex,age,.keep_all = TRUE) my_data
这条语句的意思是,在 my_data
数据框中选择出不同的行,并保留所有列。由于这条语句指定了 .keep_all = TRUE
参数,所以所有的列都会被保留。最终的结果会被保存到变量 my_data_distinct
中。
13.8 arrange()
13.8.1 升序
arrange()
函数是 tidyverse
包中的一个函数,用于对指定数据框中的行进行排序。例如,如果您想要对 my_data
数据框中的行按照 age
列的值进行排序,可以使用如下语句:
%>% arrange(id) my_data
13.8.2 降序
除了上述语句,您还可以使用 arrange()
函数中的 desc()
函数来指定是否按照降序进行排序。例如,如果您想要按照降序排序,可以使用如下语句:
%>%
my_data arrange(desc(id))
13.8.3 多个变量
%>%
my_data arrange(sex,desc(id))