我正在将分析从 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 中的解决方案。
谢谢。
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)