巧妙地计算多行条件的方法

时间:2018-07-16 19:44:07

标签: r tidyverse

我有一些交易数据,其中每行代表购买的物品,并具有关联的支票号。我正在尝试计算项目A和B在支票上出现的次数。我想出了一种蛮力的解决方案,但我很好奇有人是否有更优雅的选择。任何帮助深表感谢!数据可能看起来像...

df <- data.frame(Check=c(1, 1, 2, 3, 4, 4, 5, 5, 5),
                 Item=c('A', 'B', 'B', 'A', 'A', 'C', 'B', 'A', 'D'))

因此,对于这个问题,我想返回2。或者检查数字1和5。

4 个答案:

答案 0 :(得分:2)

您可以使用

2018-06-01

找到多少。

或者只是

sum(by(df, df$Check, function(x) all(c('A', 'B') %in% x$Item)))

看看哪个

答案 1 :(得分:2)

使用dplyr,您可以执行此操作。基本上是说“对于每个CheckA中的BItem都在Check中。如果要在此之后获取计数,可以使用sum(df$a_and_b),如果要获取支票号码,可以使用df$Check[which(df$a_and_b)]。只需记住将结果分配回df或其他变量,因为此刻正在打印结果!

library(dplyr)
df <- data.frame(
  Check = c(1, 1, 2, 3, 4, 4, 5, 5, 5),
  Item = c("A", "B", "B", "A", "A", "C", "B", "A", "D")
)
df %>%
  group_by(Check) %>%
  summarise(a_and_b = all(c('A', 'B') %in% Item))
#> # A tibble: 5 x 2
#>   Check a_and_b
#>   <dbl> <lgl>  
#> 1     1 TRUE   
#> 2     2 FALSE  
#> 3     3 FALSE  
#> 4     4 FALSE  
#> 5     5 TRUE

reprex package(v0.2.0)于2018-07-16创建。

答案 2 :(得分:2)

由于已经存在基本的R和dplyr个答案,因此我将用一个data.table解决方案来完成该圈子

library(data.table)
setDT(df)

df[, all(c('A', 'B') %in% Item), by = Check]
#    Check    V1
# 1:     1  TRUE
# 2:     2 FALSE
# 3:     3 FALSE
# 4:     4 FALSE
# 5:     5  TRUE

其他可能的输出:

df[, all(c('A', 'B') %in% Item), by = Check][V1 == TRUE, Check]
# [1] 1 5

df[, all(c('A', 'B') %in% Item), by = Check][, sum(V1)]
# [1] 2

答案 3 :(得分:1)

还有另一个基本的R解决方案。

number_of_routing_shards