Какая команда tidyverse может посчитать количество ненулевых записей по столбцам за временной ряд? - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть таблица данных, которая выглядит следующим образом:

Item        2018 2019 2020 2021 2022 2023 
Apples        10   12   17   18    0    0
Bears         40   50   60   70   80   90
Cats           5    2    1    0    0    0
Dogs          15   17   18   15   11    0

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

Item        2018 2019 2020 2021 2022 2023  Count
Apples        10   12   17   18    0    0  4
Bears         40   50   60   70   80   90  6
Cats           5    2    1    0    0    0  3
Dogs          15   17   18   15   11    0  5

NB. Я хочу провести некоторый анализ этого в следующем проходе, поэтому постараюсь просто добавить в столбец count, а не агрегировать на этом этапе. Это будет что-то вроде фильтрации строк, если число превышает пороговое значение.

Я посмотрел на команду tally() от tidyverse, но, похоже, это не делает то, что я хочу (я думаю).

NB. Я не отметил этот вопрос как tidyverse из-за указаний по этому тегу. Кричите, если мне нужно отредактировать этот пункт.

1 Ответ

0 голосов
/ 02 ноября 2018

В порядке строки мы можем использовать rowSums после преобразования подмножества набора данных в логический

library(tidyverse)    
df1 %>% 
   mutate(Count = rowSums(.[-1] > 0))

Или используя reduce

 df1 %>% 
    mutate(Count = select(., -1) %>% 
                       mutate_all(funs(. > 0)) %>% 
                       reduce(`+`))

Или с pmap

df1 %>%
    mutate(Count = pmap_dbl(.[-1], ~ sum(c(...) > 0)))
#    Item 2018 2019 2020 2021 2022 2023 Count
#1 Apples   10   12   17   18    0    0     4
#2  Bears   40   50   60   70   80   90     6
#3   Cats    5    2    1    0    0    0     3
#4   Dogs   15   17   18   15   11    0     5

данные

df1 <- structure(list(Item = c("Apples", "Bears", "Cats", "Dogs"), `2018` = c(10L, 
40L, 5L, 15L), `2019` = c(12L, 50L, 2L, 17L), `2020` = c(17L, 
60L, 1L, 18L), `2021` = c(18L, 70L, 0L, 15L), `2022` = c(0L, 
80L, 0L, 11L), `2023` = c(0L, 90L, 0L, 0L)), class = "data.frame", 
row.names = c(NA, -4L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...