我有一些交易数据,其中每行代表购买的物品,并具有关联的支票号。我正在尝试计算项目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。
答案 0 :(得分:2)
您可以使用
2018-06-01
找到多少。
或者只是
sum(by(df, df$Check, function(x) all(c('A', 'B') %in% x$Item)))
看看哪个
答案 1 :(得分:2)
使用dplyr
,您可以执行此操作。基本上是说“对于每个Check
,A
中的B
和Item
都在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