13  介绍

dplyr是一个R语言包,它提供了一组用于进行数据操作和转换的函数。下面是一些dplyr包中常用的函数及其作用:

13.1 示例数据

library(dplyr)
data<-data.frame(x=-2:3,y=1:6,a=rep(c('A','B'),each=3))
data

13.2 select()

select()dplyr包中的一个函数,它用于选择数据框中的特定列。例如,假设你有一个名为data的数据框,其中包含多列,你可以用以下代码选择列x和列y

select(data, x, y)

在这个例子中,select()函数会返回一个新的数据框,其中只包含原来数据框中的列x和列y。你也可以使用通配符来选择多个列。例如:

select(data, starts_with("x"))

这里的starts_with()函数会匹配所有以x开头的列名,例如x1x2等,然后select()函数会返回一个新的数据框,其中包含原数据框中所有以x开头的列。

除了选择列,你还可以用select()函数来排除列。例如:

select(data, -x)

这里,我们使用了负号(-)来排除列xselect()函数会返回一个新的数据框,其中包含原数据框中除列x以外的所有列。

你也可以使用类似的方式来排除多个列,例如:

select(data, -starts_with("x"))

这里,我们使用了starts_with()函数来匹配所有以x开头的列名,然后用负号排除这些列。select()函数会返回一个新的数据框,其中包含原数据框中除了以x开头的列以外的所有列。

除了使用函数来选择或排除列,你还可以使用类似于SQL中的语法来指定要选择或排除的列。例如:

select(data, x, y, -a)

这里,我们指定了要选择列x和列y,并使用负号排除列aselect()函数会返回一个新的数据框,其中包含原数据框中的列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,其值为xy的和:

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_data

group_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 按照 agesex 两个变量的值进行多级分组,可以使用如下语句:

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))