R中按组计算数据帧行之间的差异
在本文中,我们将看到如何通过 R 编程语言中的数据帧中的组来查找行之间的差异。
方法一:使用dplyr包
group_by 方法用于根据特定列中包含的组划分和隔离日期。所需的分组依据列被指定为该函数的参数。它可能包含多个列名。
句法:
group_by(col1, col2, …)
接下来是 mutate() 方法的应用,该方法用于移动方向并在数据中执行操作。可以使用新列名指定新列名。可以使用该库的 lag() 方法计算与前一行的差异。此方法在向量中查找先前的值。
Syntax:
lag(x, n = 1L, default = NA)
Parameter:
- x – A vector of values
- n – Number of positions to lag by
- default (Default : NA)- the value used for non-existent rows.
通过使用从指定列的特定行中减去的列值的滞后,在数据框中引入突变。默认值是使用 first(col-name) 的特定组的第一个值。
例子:
R
# installing required libraries
library("dplyr")
# creating a data frame
data_frame <- data.frame(col1 = sample(6:9, 9 , replace = TRUE),
col2 = letters[1:3],
col3 = c(1,4,5,1,NA,NA,2,NA,2))
print ("Original DataFrame")
print (data_frame)
print ("Modified DataFrame")
# comouting difference of each group
data_frame%>%group_by(col1)%>%mutate(diff=col3-lag(
col3,default=first(col3)))
R
# installing required libraries
library("data.table")
# creating a data frame
data_frame <- data.table(col1 = sample(6:9, 9 , replace = TRUE),
col2 = letters[1:3],
col3 = c(1,4,5,1,9,11,2,7,2))
print ("Original DataFrame")
print (data_frame)
# comouting difference of each group
data_frame[ , diff := col3 - shift(col3), by = col1]
print ("Modified DataFrame")
print (data_frame)
R
# creating a data frame
data_frame <- data.frame(col1 = sample(6:9, 9 , replace = TRUE),
col2 = letters[1:3],
col3 = c(1,4,5,1,9,11,2,7,2))
print ("Original DataFrame")
print (data_frame)
# comouting difference of each group
data_frame$diff <- ave(data_frame$col3, factor(data_frame$col1),
FUN=function(x) c(NA,diff(x)))
print ("Modified DataFrame")
print (data_frame)
输出
[1] "Original DataFrame"
col1 col2 col3
1 6 a 1
2 9 b 4
3 7 c 5
4 6 a 1
5 6 b NA
6 9 c NA
7 6 a 2
8 8 b NA
9 7 c 2
[1] "Modified DataFrame"
# A tibble: 9 x 4
# Groups: col1 [4]
col1 col2 col3 diff
1 6 a 1 0
2 9 b 4 0
3 7 c 5 0
4 6 a 1 0
5 6 b NA NA
6 9 c NA NA
7 6 a 2 NA
8 8 b NA NA
9 7 c 2 -3
方法 2:使用 data.table 包
数据框索引方法可用于在 R 中按组计算行的差异。 'by' 属性用于指定对数据进行分组的列。保留所有行,同时在列集合中添加一个新列,使用该列来计算该组的行差异。差异是通过使用指定列的特定行并从中减去使用 shift() 方法计算的先前值来计算的。 shift 方法用于滞后向量或列表。
句法:
data_frame[ , new-col-name := reqd-col – shift(reqd-col), by = grouping-col]
该特定组的第一个实例被该特定列中的 NA 替换。
例子:
电阻
# installing required libraries
library("data.table")
# creating a data frame
data_frame <- data.table(col1 = sample(6:9, 9 , replace = TRUE),
col2 = letters[1:3],
col3 = c(1,4,5,1,9,11,2,7,2))
print ("Original DataFrame")
print (data_frame)
# comouting difference of each group
data_frame[ , diff := col3 - shift(col3), by = col1]
print ("Modified DataFrame")
print (data_frame)
输出
[1] "Original DataFrame"
col1 col2 col3
1: 8 a 1
2: 8 b 4
3: 7 c 5
4: 6 a 1
5: 6 b 9
6: 8 c 11
7: 8 a 2
8: 9 b 7
9: 7 c 2
[1] "Modified DataFrame"
col1 col2 col3 diff
1: 8 a 1 NA
2: 8 b 4 3
3: 7 c 5 NA
4: 6 a 1 NA
5: 6 b 9 8
6: 8 c 11 7
7: 8 a 2 -9
8: 9 b 7 NA
9: 7 c 2 -3
方法 3:使用 ave() 方法
基础 R 中的 ave() 方法用于对因子水平组合的平均值进行分组。
Syntax:
ave(x, group , FUN = mean)
Parameter :
- x – the required data frame column
- group – the grouping variables
- FUN – The function to apply for each factor level combination.
这里的函数是计算该行中特定列的差值以及前一行与其的差值。该特定组的第一个实例被该特定列中的 NA 替换。
例子:
电阻
# creating a data frame
data_frame <- data.frame(col1 = sample(6:9, 9 , replace = TRUE),
col2 = letters[1:3],
col3 = c(1,4,5,1,9,11,2,7,2))
print ("Original DataFrame")
print (data_frame)
# comouting difference of each group
data_frame$diff <- ave(data_frame$col3, factor(data_frame$col1),
FUN=function(x) c(NA,diff(x)))
print ("Modified DataFrame")
print (data_frame)
输出
[1] "Original DataFrame"
col1 col2 col3
1 9 a 1
2 9 b 4
3 6 c 5
4 7 a 1
5 6 b 9
6 7 c 11
7 9 a 2
8 9 b 7
9 9 c 2
[1] "Modified DataFrame"
col1 col2 col3 diff
1 9 a 1 NA
2 9 b 4 3
3 6 c 5 NA
4 7 a 1 NA
5 6 b 9 4
6 7 c 11 10
7 9 a 2 -2
8 9 b 7 5
9 9 c 2 -5