Группировка по столбцу и подсчет количества положительных и отрицательных значений, соответствующих каждому значению в R - PullRequest
0 голосов
/ 20 февраля 2019

Я хочу иметь список положительных и отрицательных значений, соответствующих каждому значению, которое появляется после группировки столбца.Мои данные выглядят так:

dataset <- read.table(text = 
"id value
1 4
1 -2
1 0
2 6
2 -4
2 -5
2 -1
3 0
3 0
3 -4
3 -5",
header = TRUE, stringsAsFactors = FALSE)

Я хочу, чтобы мой результат выглядел так:

id num_pos_value num_neg_value num_zero_value
1 1 1 1 
2 1 3 0
3 0 2 2

Я хочу расширить столбцы приведенного выше результата, добавив сумму положительных иотрицательные значения.

id num_pos num_neg num_zero sum_pos sum_neg
1 1 1 1 4 -2
2 1 3 0 6 -10
3 0 2 2 0 -9

1 Ответ

0 голосов
/ 20 февраля 2019

Мы создаем группу по 'id' и вычисляем sum логического вектора

library(dplyr)
df1 %>% 
   group_by(id) %>% 
   summarise(num_pos = sum(value > 0), 
             num_neg = sum(value < 0), 
             num_zero = sum(value == 0))
# A tibble: 3 x 4
#     id num_pos num_neg num_zero
#  <int>   <int>   <int>    <int>
#1     1       1       1        1
#2     2       1       3        0
#3     3       0       2        2

Или получаем table из sign из 'value' и spreadэто «широкий»

library(tidyr)
df1 %>% 
   group_by(id) %>% 
   summarise(num = list(table(factor(sign(value), levels = -1:1)))) %>%
   unnest %>% 
   mutate(grp = rep(paste0("num", c("pos", "zero", "neg")), 3)) %>% 
   spread(grp, num)

Или с использованием count

df1 %>%
   count(id, val = sign(value)) %>% 
   spread(val, n, fill = 0)

data

df1 <- structure(list(id = c(1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 
 3L), value = c(4L, -2L, 0L, 6L, -4L, -5L, -1L, 0L, 0L, -4L, -5L
 )), class = "data.frame", row.names = c(NA, -11L))
...