我有一个数据表,如下所示:
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
。喊我是否需要编辑这一点。
答案 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))