R语言 使用Dplyr将一个函数应用到每个组中
在这篇文章中,我们将学习如何使用R编程语言中的dplyr对每个组应用一个函数。
R语言中的dplyr包用于数据操作和修改。该包可以通过以下命令下载并安装到工作空间。
install.packages("dplyr")
什么是tibble
tibble是R语言中一种类似于数据框架的结构,它包含以表格结构排列的行和列。它说明了数据框架的列的数据类型。它可以在R中使用以下维度来创建。
tibble(
col-1-name = values,
col-2-name = values)
group_by()
为了将一个函数应用于数据中的每一个组,我们需要首先根据可用的类对数据进行分组。dplyr包中的group_by()方法将数据分为不同的部分。它的语法如下。
语法:group_by(col1, col2…)
参数 :
- col1, col2,… – 要对数据进行分组的列
方法1:使用mutate方法
R中的 mutate()方法 使用管道操作符在提供的数据中创建新的列。mutate()方法被用来计算所提供的聚合函数。
语法: mutate(new-col-name = func)
参数:
- new-col-name – 要添加到tibble中的新列
- func – 要在指定的数据帧上应用的函数。
下面的代码片断说明了这样一个过程:tibble中的数据根据col x中的值被分成几组,然后计算y col值的总和并按组返回。
在这个例子中,行号1、5和9对应于’x’列中的值2。y “列中的值分别为1、5和9。这些值的总和是15,在输出的tibble中被返回。在x列中对应于2的每一行,在sum_group_y列中显示15。
# Importing dplyr package
library(dplyr)
# Creating a tibble in R
data = tibble(
x = c(2,4,5,6,2,5,6,6,2,6),
y = 1:10)
print("Data")
print(data)
# Grouping the data by x and
# then computing the group wise
# sum using y column
data %>% group_by(x) %>%
mutate(sum_group_y = sum(y))
输出
# A tibble: 10 x 2
x y
<dbl> <int>
1 2 1
2 4 2
3 5 3
4 6 4
5 2 5
6 5 6
7 6 7
8 6 8
9 2 9
10 6 10
# A tibble: 10 x 3
# Groups: x [4]
x y sum_group_y
<dbl> <int> <int>
1 2 1 15
2 4 2 2
3 5 3 9
4 6 4 29
5 2 5 15
6 5 6 9
7 6 7 29
8 6 8 29
9 2 9 15
10 6 10 29
方法2:使用group_map方法
group_map()方法也可以对tibble中的每个组应用一个函数。该方法返回相当于返回组数的tibble数量。它的语法如下:
语法: group_map(.data, .f, …, .keep = FALSE)
参数 :
- .data – 一个分组的tibble
- . f – 要应用的函数
下面的代码片段说明了group_map()方法在分组的tibble上的用法,其中用户定义的条目是基于列x值分组的。根据每个tibble分组值计算出列y值的总和。声明并定义了一个用户定义的sum_y函数,它将输出作为输入向量值的总和。
# Importing dplyr
library(dplyr)
# Creating a tibble
data = tibble(
x = c(2,4,5,6,2,5,6,6,2,6),
y = 1:10)
print("Data")
print(data)
sum_y = function(vector) {
return(tibble::tibble(sum = sum(vector)))
}
# Grouping the data by x and
# then computing the group wise
# sum using y column
data %>%
group_by(x) %>%
group_map(~sum_y(.x$y))
输出
[1] "Data"
> print(data)
# A tibble: 10 × 2
x y
<dbl> <int>
1 2 1
2 4 2
3 5 3
4 6 4
5 2 5
6 5 6
7 6 7
8 6 8
9 2 9
10 6 10
[[1]]
# A tibble: 1 x 1
sum
<int>
1 15
[[2]]
# A tibble: 1 x 1
sum
<int>
1 2
[[3]]
# A tibble: 1 x 1
sum
<int>
1 9
[[4]]
# A tibble: 1 x 1
sum
<int>
1 29