根据data.frame中每组的xy坐标计算斜率

时间:2018-09-02 22:28:03

标签: r dataframe dplyr

我有一个xy data.frame以及其他factor,例如:

df <- data.frame(y = c(0.05, -0.03, -0.13, -0.24, 0.05, -0.03, -0.13, -0.24, 0.59, 1.97, 2.26, 1.89, 0.59, 1.97, 2.26, 1.89),
                      x = c(0, 1.58, 2, 4.58, 0, 1.58, 2, 4.58, 0, 1.58, 2, 4.58, 0, 1.58, 2, 4.58),
                      sex = c('F', 'F', 'F', 'F', 'M', 'M', 'M', 'M', 'F', 'F', 'F', 'F', 'M', 'M', 'M', 'M'),
                      group = c('B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A'))

我正在寻找一种function(可能最好使用dplyr)来计算斜率(y中的差异除以{{ 1}},在x中每个因子的每个级别之间,在每对连续的x点之间)。在此示例中,我将有4组斜率:dfgroup = Asex = Fgroup = Asex = M和{{1} },以及group = Bsex = F

如果可能的话,如果解决方案是通用的,那么它比本示例中指定的适用于group = B的情况要好得多(条件是所有因子都属于sex = M类)。

有什么主意吗?

1 个答案:

答案 0 :(得分:2)

为了使用dplyr(根据您的定义)查找斜率,可以使用lag()函数。

leadlag函数:

  

查找向量中的“下一个”或“上一个”值。用于比较当前值之前或之后的值。

为了实现按因子变量分组,您可以首先使用dplyr::group_by()。这是可概括的,可以接受一个或多个分组变量。

以下是可重现的示例,其中显示了每个组的此计算。

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union

df <- data.frame(y = c(0.05, -0.03, -0.13, -0.24, 0.05, -0.03, -0.13, -0.24, 0.59, 1.97, 2.26, 1.89, 0.59, 1.97, 2.26, 1.89),
                 x = c(0, 1.58, 2, 4.58, 0, 1.58, 2, 4.58, 0, 1.58, 2, 4.58, 0, 1.58, 2, 4.58),
                 sex = c('F', 'F', 'F', 'F', 'M', 'M', 'M', 'M', 'F', 'F', 'F', 'F', 'M', 'M', 'M', 'M'),
                 group = c('B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A'))

df %>% 
  group_by(sex, group) %>% 
  mutate(slope = (y - lag(y)) / (x - lag(x)))
#> # A tibble: 16 x 5
#> # Groups:   sex, group [4]
#>          y     x sex   group    slope
#>      <dbl> <dbl> <fct> <fct>    <dbl>
#>  1  0.0500  0.   F     B      NA     
#>  2 -0.0300  1.58 F     B      -0.0506
#>  3 -0.130   2.00 F     B      -0.238 
#>  4 -0.240   4.58 F     B      -0.0426
#>  5  0.0500  0.   M     B      NA     
#>  6 -0.0300  1.58 M     B      -0.0506
#>  7 -0.130   2.00 M     B      -0.238 
#>  8 -0.240   4.58 M     B      -0.0426
#>  9  0.590   0.   F     A      NA     
#> 10  1.97    1.58 F     A       0.873 
#> 11  2.26    2.00 F     A       0.690 
#> 12  1.89    4.58 F     A      -0.143 
#> 13  0.590   0.   M     A      NA     
#> 14  1.97    1.58 M     A       0.873 
#> 15  2.26    2.00 M     A       0.690 
#> 16  1.89    4.58 M     A      -0.143

reprex package(v0.2.0)于2018-09-03创建。