我有以下数据集:
Handler
我正在尝试得出每个产品列的非零行数。所需的输出如下:
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")
我尝试使用dplyr,但不确定在值不为零的情况下如何获取计数。我不确定是否应该将所有ZEROS都转换为NA,这似乎不是很直观……还是应该使用filter删除零。
BRAND VARIANT Noodles Peas milk
1 BRANDA VAR1 4 2 5
答案 0 :(得分:3)
如果我们想找出所有其余列的非零计数,我们可以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
如果还有其他一些列,并且您只想为特定的列计算非零值,我们可以类似地使用summarise_at
df %>%
group_by(BRAND, VARIANT) %>%
summarise_at(vars(Noodles, Peas, milk), ~sum(. != 0))
或以基数R aggregate
aggregate(.~BRAND + VARIANT, df, function(x) sum(x != 0))
答案 1 :(得分:0)
我们可以使用data.table
使用
library(data.table)
setDT(df)[, lapply(.SD, function(x) sum(x != 0)), .(BRAND, VARIANT)]