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<-data.frame(x=-2:3,y=1:6,a=rep(c('A','B'),each=3))
data13.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():选择所有列。
my_data<-data.frame(age=1:3) %>%
  mutate(age1=age,age2=age,Age1=age,new_age=age,new_age_old=age,
         chr_age=as.character(age))
my_data例如,如果您想要选择 my_data 数据框中名称以 age 开头的列,可以使用如下语句:
my_data %>% select(starts_with("age"))这条语句的意思是,在 my_data 数据框中选择名称以 age 开头的列,并将结果保存到变量 my_data_selected 中。
如果您想要选择 my_data 数据框中名称以 age 结尾的列。
如果您想要选择 my_data 数据框中名称以 age 结尾的列,可以使用如下语句:
my_data %>% select(ends_with("age"))如果您想要选择 my_data 数据框中名称中包含 age 的列,可以使用如下语句:
my_data %>% select(contains("age"))如果您想要选择 my_data 数据框中名称与正则表达式 "a.e" 相匹配的列,可以使用如下语句:
my_data %>% select(matches("a.e"))如果您想要选择 my_data 数据框中名称在列表 c("age", "height") 中出现过的列,可以使用如下语句:
my_data %>% select(one_of(c("age", "height")))Warning: Unknown columns: `height`如果您想要选择 my_data 数据框中的所有列,可以使用如下语句:
my_data %>% select(everything())13.2.2 其他的选择器函数
除了以上提到的选择器函数,tidyverse 语法中还有一些其他选择器函数可以用来选择数据框中的特定列。例如,还有以下几种常用的选择器函数:
- num_range():选择名称在指定数字范围内的列。
- where():选择满足某个条件的列。
例如,如果您想要选择 my_data 数据框中名称在数字范围 [1,5] 内的列,可以使用如下语句:
my_data %>% select(num_range(1, 5))my_data %>% select(where(is.numeric))my_data %>% select(where(is.character))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()
my_data<-data.frame(
  id=1:6,
  age=3:4,
  sex=rep(c('Female','Male'),each=3),
  los=runif(6,3,10) %>% round()
)
my_datagroup_by() 是 dplyr包中的一个函数,它能够将数据按照指定的条件进行分组。通常,我们使用 group_by() 函数将数据按照某个变量的值进行分组,然后再对每个分组进行进一步的操作。
例如,假设我们有一个数据框 my_data,如果我们想要将数据框 my_data 按照 age 变量的值进行分组,可以使用如下语句:
my_data_grouped <- group_by(my_data, age)这条语句的意思是,使用 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 数据框中选择出不同的行,可以使用如下语句:
my_data %>% distinct(sex,.keep_all = T)这条语句的意思是,在 my_data 数据框中选择出不同的行,并将结果保存到变量 my_data_distinct 中。
除了上述语句,您还可以使用 distinct() 函数指定选择哪些列来检查行的唯一性。例如,如果您想要仅以 age 列为依据来选择不同的行,可以使用如下语句:
my_data %>% distinct(age)这条语句的意思是,在 my_data 数据框中选择出不同的行,并仅以 age 列为依据来检查行的唯一性。由于这条语句只检查了 age 列,所以如果两行中 age 列的值相同,那么这两行都会被认为是重复的,只会保留一行。最终的结果会被保存到变量 my_data_distinct 中。
另外,您还可以使用 distinct() 函数中的 .keep_all 参数来指定是否保留所有列。例如,如果您想要保留所有列,可以使用如下语句:
my_data %>% distinct(sex,age,.keep_all = TRUE)这条语句的意思是,在 my_data 数据框中选择出不同的行,并保留所有列。由于这条语句指定了 .keep_all = TRUE 参数,所以所有的列都会被保留。最终的结果会被保存到变量 my_data_distinct 中。
13.8 arrange()
13.8.1 升序
arrange() 函数是 tidyverse 包中的一个函数,用于对指定数据框中的行进行排序。例如,如果您想要对 my_data 数据框中的行按照 age 列的值进行排序,可以使用如下语句:
my_data %>% arrange(id)13.8.2 降序
除了上述语句,您还可以使用 arrange() 函数中的 desc() 函数来指定是否按照降序进行排序。例如,如果您想要按照降序排序,可以使用如下语句:
my_data %>% 
  arrange(desc(id))13.8.3 多个变量
my_data %>%
  arrange(sex,desc(id))