我有以下数据集:
structure(list(BRAND = c("BRANDA", "BRANDA", "BRANDA", "BRANDA",
"BRANDA"), VARIANT = c("VAR1", "VAR1", "VAR1",
"VAR1", "VAR1"), Noodles = c(20L, 100L, 10L, 0L,
50L), Peas = c(14L, 0L, 0L, 0L, 14L), milk = c(1710L, 468L,
1020L, 585L, 1710L)), row.names = c(NA, 5L), class = "data.frame")
Run Code Online (Sandbox Code Playgroud)
我正在尝试为每个产品列导出非零的行数。所需的输出如下:
BRAND VARIANT Noodles Peas milk
1 BRANDA VAR1 4 2 5
Run Code Online (Sandbox Code Playgroud)
我曾尝试使用 dplyr,但不确定如何获取值不为零的计数。我不确定是否应该将所有零转换为 NA,这看起来不太直观……或者我是否应该使用过滤器来删除零。
a <- ndf %>% group_by(BRAND, VARIANT) %>% summarise_all(funs(n()))
Run Code Online (Sandbox Code Playgroud)
如果我们想找出所有剩余列的非零计数,我们可以group_by
BRAND
和 VARIANT 使用summarise_all
。
library(dplyr)
df %>%
group_by(BRAND, VARIANT) %>%
summarise_all(~sum(. != 0))
# BRAND VARIANT Noodles Peas milk
# <chr> <chr> <int> <int> <int>
#1 BRANDA VAR1 4 2 5
Run Code Online (Sandbox Code Playgroud)
如果还有其他一些列并且您有兴趣仅为特定列计算非零值,我们可以summarise_at
类似地使用
df %>%
group_by(BRAND, VARIANT) %>%
summarise_at(vars(Noodles, Peas, milk), ~sum(. != 0))
Run Code Online (Sandbox Code Playgroud)
或与基地 R aggregate
aggregate(.~BRAND + VARIANT, df, function(x) sum(x != 0))
Run Code Online (Sandbox Code Playgroud)