📜  R中按组计算数据帧行之间的差异

📅  最后修改于: 2022-05-13 01:54:40.231000             🧑  作者: Mango

R中按组计算数据帧行之间的差异

在本文中,我们将看到如何通过 R 编程语言中的数据帧中的组来查找行之间的差异。

方法一:使用dplyr包

group_by 方法用于根据特定列中包含的组划分和隔离日期。所需的分组依据列被指定为该函数的参数。它可能包含多个列名。

句法:

接下来是 mutate() 方法的应用,该方法用于移动方向并在数据中执行操作。可以使用新列名指定新列名。可以使用该库的 lag() 方法计算与前一行的差异。此方法在向量中查找先前的值。



通过使用从指定列的特定行中减去的列值的滞后,在数据框中引入突变。默认值是使用 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 方法用于滞后向量或列表。



句法:

该特定组的第一个实例被该特定列中的 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() 方法用于对因子水平组合的平均值进行分组。

这里的函数是计算该行中特定列的差值以及前一行与其的差值。该特定组的第一个实例被该特定列中的 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