根据来自其他 data.frame 的多个条件进行计数

SFu*_*Fuj 5 r dataframe

我正在将分析从 Excel 迁移到 R,并且想要一些关于如何最好地在 R 中执行类似于 Excel 的 COUNTIFS 的内容的输入。

我有两个 data.frames,statef 和 memberdf。

statedf=data.frame(state=c('MD','MD','MD','NY','NY','NY'), week = 5:7) 
memberdf=data.frame(memID = 1:15, state = c('MD','MD','NY','NY','MD'),
              finalweek = c(3,3,5,3,3,5,3,5,3,5,6,5,2,3,5),
              orders = c(1,2,3))
Run Code Online (Sandbox Code Playgroud)

此数据用于基于订阅的业务。我想知道statef中每周/状态组合新失效的成员数量,其中新失效的定义是statef$week - 1 = memberdf$finalweek。此外,我想对每个订单值(1、2、3)进行单独计数。

所需的输出看起来像

out <- data.frame(state=c('MD','MD','MD','NY','NY','NY'), week = 5:7,
               oneorder = c(0,1,0,0,0,0),
               twoorder = c(0,0,1,0,1,0),
               threeorder = c(0,3,0,0,1,0))
Run Code Online (Sandbox Code Playgroud)

昨天问了(并得到了很好的回应)这个问题的一个更简单的版本——答案围绕着创建一个基于 member.df 的新 data.frame 展开。但是,我需要将数据附加到statef,因为statef 具有memberf 中不存在的成员/周组合,反之亦然。如果这是在 Excel 中,我会使用 COUNTIFS 但正在努力寻找 R 中的解决方案。

谢谢。

Sam*_*rke 3

dplyr这是带有和包的解决方案tidyr

library(tidyr) ; library(dplyr)

counts <- memberdf %>%
  mutate(lapsedweek = finalweek + 1) %>%
  group_by(state, lapsedweek, orders) %>%
  tally()
counts <- counts %>% spread(orders, n, fill = 0)    
out <- left_join(statedf, counts, by = c("state", "week" = "lapsedweek"))
out[is.na(out)] <- 0 # convert rows with all NAs to 0s
names(out)[3:5] <- paste0("order", names(out)[3:5]) # rename columns
Run Code Online (Sandbox Code Playgroud)