我有一个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组斜率:df
和group = A
,sex = F
和group = A
,sex = M
和{{1} },以及group = B
和sex = F
。
如果可能的话,如果解决方案是通用的,那么它比本示例中指定的适用于group = B
的情况要好得多(条件是所有因子都属于sex = M
类)。
有什么主意吗?
答案 0 :(得分:2)
为了使用dplyr
(根据您的定义)查找斜率,可以使用lag()
函数。
lead
和lag
函数:
查找向量中的“下一个”或“上一个”值。用于比较当前值之前或之后的值。
为了实现按因子变量分组,您可以首先使用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创建。