Как сгруппировать новые расчеты с помощью суммирования? - PullRequest
0 голосов
/ 07 ноября 2019

Я хотел бы сгруппировать данные по столбцу y. У меня есть дополнительные расчеты для разностей, которые мне нужно подвести для каждого значения у. Является ли функция summarise правильной для этого типа расчета?

x <- sample(c(0:5),20, replace = T)
y <- rep(c("A", "B","C","D"), each = 5)
df <- data.frame(y, x)

inds <- c(0, diff(df$x))
inds <- -inds * (inds < 0)

df %>% 
  group_by(y) %>% 
  summarise(inds <- c(0, diff(df$x)), 
            inds <- -inds * (inds < 0))

> inds
[1] 0 2 0 0 5 0 0 1 2
> cbind(df, inds)
  y x inds
1 A 3    0
2 A 1    2
3 A 5    0
4 B 5    0
5 B 0    5
6 B 1    0
7 C 3    0
8 C 2    1
9 C 0    2

Desired outcome:
y x new_variable
1 A 2    
2 B 5    
3 C 3    

На самом деле я получаю ошибку:

Ошибка: столбец inds <- c (0, diff (df$ x)) должно быть длиной 1 (суммарное значение), а не 9. </p>

Ответы [ 4 ]

2 голосов
/ 07 ноября 2019

Я думаю, что вы хотите сделать, это

library(dplyr)

df %>%
  mutate(inds = c(0, diff(x)), 
         inds = -inds * (inds < 0)) %>%
  group_by(y) %>%
  summarise(sum = sum(inds))

#   y       sum
#  <fct> <dbl>
#1 A         2
#2 B         5
#3 C         3

данные

df <- structure(list(y = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 
3L), .Label = c("A", "B", "C"), class = "factor"), x = c(3L, 
1L, 5L, 5L, 0L, 1L, 3L, 2L, 0L)), row.names = c("1", "2", "3", 
"4", "5", "6", "7", "8", "9"), class = "data.frame")
1 голос
/ 07 ноября 2019

Вы также можете сделать это в базе R.

aggregate(. ~ y, transform(DF, ind=-c(0, diff(DF$x)) * (c(0, diff(DF$x)) < 0)), sum)
#   y x ind
# 1 A 9   2
# 2 B 6   5
# 3 C 5   3

Данные

DF <- structure(list(y = c("A", "A", "A", "B", "B", "B", "C", "C", 
"C"), x = c(3L, 1L, 5L, 5L, 0L, 1L, 3L, 2L, 0L)), row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9"), class = "data.frame")
1 голос
/ 07 ноября 2019

вы можете сначала использовать mutate для создания столбца inds, а summarise впоследствии:

df %>%
  group_by(y) %>%
  mutate(inds = x - dplyr::lag(x, default = x[1])) %>%
  summarise(inds_new = sum(-inds[inds < 0]))

# A tibble: 4 x 2
  y     inds_new
  <fct>    <int>
1 A            5
2 B            2
3 C            3
4 D            3
1 голос
/ 07 ноября 2019

Используйте sum плюс нет необходимости $ внутри %>% и используйте set.seed с sample для обеспечения воспроизводимости.

library(dplyr)
df %>% 
    group_by(y) %>% 
    summarise(inds = sum(-c(0, diff(x)) * (c(0, diff(x)) < 0)))

# A tibble: 3 x 2
  y      inds
  <chr> <dbl>
1 A         2
2 B         5
3 C         3
...