Я хочу, чтобы разница в "оценка" для двух периодов для каждого идентификатора.

   id <- rep(1:3,each=2)
period <- rep(1:2,3)
score <- c(3,2,4,1,8,5)

df <- data.frame(id, period,score)
df
id period score
1      1     3
1      2     2
2      1     4
2      2     1
3      1     8
3      2     5

Я думал сначала сгруппировать по идентификатору, но затем я должен также сгруппировать по периодам, а затем суммировать для оценки. Как мне это сделать?

df %>% group_by(id) %>%

Должно выглядеть

 id score
     1     1
     2     3
     3     3  
r
3
user11916948 22 Апр 2020 в 22:00

2 ответа

Лучший ответ

Мы можем использовать diff после группировки по 'id'

library(dplyr)
df %>% 
    group_by(id) %>%
    summarise(score = abs(diff(score)))
# A tibble: 3 x 2
#     id score
#  <int> <dbl>
#1     1     1
#2     2     3
#3     3     3

Или в base R с aggregate

aggregate(score ~ id, df, diff)
2
akrun 22 Апр 2020 в 19:05

Исходя из вашего желаемого результата, вы хотите вычесть период 2 из периода 1, я прав?

Если так, я не думаю, что вы можете назвать это средним. Одним из возможных решений является сделать:

library(dplyr)
library(tidyr)

df %>% pivot_wider(names_from = period, values_from = score) %>%
    mutate(Avg = `1` - `2`) %>% select(id, Avg)

Другая возможность состоит в том, чтобы назначить отрицательное число для оценки за период 2, а затем суммировать оценку для каждого идентификатора:

library(dplyr)

df %>% mutate(score = ifelse(period == 2, score*-1, score)) %>%
    group_by(id) %>% summarise(Score = sum(score))

# A tibble: 3 x 2
     id Score
  <int> <dbl>
1     1     1
2     2     3
3     3     3
2
dc37 22 Апр 2020 в 19:07