计算没有循环的分组行

时间:2018-09-10 11:32:10

标签: r dataframe

我有一个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列中每种产品的零?

3 个答案:

答案 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]