我有一个tidy
数据集,它描述产品的属性。每个产品都有许多属性,每个属性在每一行中进行描述。我的目标是在不使用循环的情况下对每种产品进行一些计算。不想使用循环的原因是有数十万种产品,因此有数百万个属性。
只有一种产品的玩具数据集:
df <- data.frame(productID = 1, attributeID = seq(1,15,1), dataType = c('range', 'range', 'predefined', 'predefined', 'bool', 'bool', 'bool', 'bool', 'double', 'double', 'double', 'double', 'double', 'double', 'double'), double = c(NA,NA,NA,NA,NA,NA,NA,NA,0,0,15,11.4,6,0,0), logical = c(NA,NA,NA,NA,TRUE,FALSE,FALSE,FALSE,NA,NA,NA,NA,NA,NA,NA), predefined = c(NA,NA,'Black','Round',NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA), from.value = c(0,0,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA), to.value = c(249,368,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA))
# productID attributeID dataType double logical predefined from.value to.value
# 1 1 1 range NA NA <NA> 0 249
# 2 1 2 range NA NA <NA> 0 368
# 3 1 3 predefined NA NA Black NA NA
# 4 1 4 predefined NA NA Round NA NA
# 5 1 5 bool NA TRUE <NA> NA NA
# 6 1 6 bool NA FALSE <NA> NA NA
# 7 1 7 bool NA FALSE <NA> NA NA
# 8 1 8 bool NA FALSE <NA> NA NA
# 9 1 9 double 0.0 NA <NA> NA NA
# 10 1 10 double 0.0 NA <NA> NA NA
# 11 1 11 double 15.0 NA <NA> NA NA
# 12 1 12 double 11.4 NA <NA> NA NA
# 13 1 13 double 6.0 NA <NA> NA NA
# 14 1 14 double 0.0 NA <NA> NA NA
# 15 1 15 double 0.0 NA <NA> NA NA
例如,如何计算double
列中每种产品的零?
答案 0 :(得分:2)
由于您只是在计算double
列中的零数目之后,因此以下内容应会有所帮助:
library(tidyverse)
df %>%
group_by(productID) %>%
summarise(sum.of.zeros=sum(double==0, na.rm = T))
以上总结了double
等于零(如果它等于零,则将计为1(TRUE
),如果不等于0(FALSE
)的情况。需要na.rm = T
,因为表达式NA==0
将返回NA
。
答案 1 :(得分:1)
看看tidyverse
软件包,尤其是dplyr
library(tidyverse)
df %>% group_by( productID, from.value ) %>% summarise( amount = n_distinct( attributeID ))
# # A tibble: 2 x 3
# # Groups: productID [?]
# productID from.value amount
# <dbl> <dbl> <int>
# 1 1 0 2
# 2 1 NA 13
答案 2 :(得分:1)
使用data.table
,您可以执行以下操作:
library("data.table")
setDT(df)[, sum(na.omit(double)==0), productID]
或
setDT(df)[, sum(double==0, na.rm=TRUE), productID]