哪个tidyverse命令可以在一个时间序列中按列计算非零条目的数量?

时间:2018-11-02 17:04:21

标签: r

我有一个数据表,如下所示:

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列而不在此阶段进行汇总。如果计数大于阈值,则类似于过滤行。

我从tidyverse看了tally()命令,但这似乎并没有实现我想要的(我认为)。

注意,由于该标签上的指导,我没有将其标记为tidyverse。喊我是否需要编辑这一点。

1 个答案:

答案 0 :(得分:1)

因为它是按行排列的,所以我们可以在将数据集的子集转换为逻辑后使用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))