Вычислить уклоны от координат ху на группу в data.frame - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть 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, деленную на разницу x, между каждой парой последовательно x баллов), для каждого уровня каждого из факторов в df. В этом примере у меня будет 4 группы уклонов: для group = A и sex = F, group = A и sex = M, group = B и sex = F и для group = B и sex = M.

Если возможно, было бы неплохо, если бы решение было универсальным, чтобы оно применимо к большему factors, чем указано в этом примере (при условии, что все факторы относятся к классу factor).

Есть идеи?

1 Ответ

0 голосов
/ 03 сентября 2018

Чтобы найти наклон (согласно вашему определению) с помощью 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

Создано в 2018-09-03 пакетом Представить (v0.2.0).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...