在R中使用dplyr统计两变量首次出现(排除变量相等情形)
用dplyr实现IPC与2IPC首次出现的标记
当然可以用dplyr完美替代Excel的COUNTIFS来搞定这个需求!而且代码逻辑更清晰,还能轻松处理更大的数据集,比手动在Excel里写函数省心多了。
核心逻辑拆解
我们要实现的效果是:
- 排除IPC与2IPC取值完全相同的案例(这类行的
occurrence直接设为0) - 对于IPC和2IPC不同的组合,标记该组合首次出现的行为1,后续重复出现的行为0
完整代码实现
假设你的原始数据框名为df,直接运行下面的代码就能生成目标occurrence列:
library(dplyr) df <- df %>% # 第一步:先把IPC和2IPC相同的行直接标记为0,其他先设为NA留待后续处理 mutate(occurrence = ifelse(IPC == 2IPC, 0, NA)) %>% # 第二步:按IPC和2IPC的组合分组,对未标记的行判断是否是首次出现 group_by(IPC, 2IPC) %>% mutate(occurrence = ifelse(is.na(occurrence), ifelse(row_number() == 1, 1, 0), occurrence)) %>% # 取消分组,避免后续操作受分组影响 ungroup()
代码解释
- 初始标记:用
ifelse直接把IPC和2IPC相等的行的occurrence设为0,其他行暂时设为NA,这样我们只需要处理剩下的行。 - 分组标记首次出现:通过
group_by(IPC, 2IPC)把相同组合的行归为一组,然后用row_number()判断是否是组内第一行——第一行设为1,其余设为0。 - 取消分组:最后用
ungroup()取消分组,确保后续对数据框的操作不受分组限制。
验证示例数据
把你提供的示例数据代入这段代码,得到的occurrence列会和你用Excel生成的完全一致,比如:
- 1968年的
(G01S, Na)组合首次出现,标记为1;1969年再次出现时标记为0 - 所有IPC和2IPC相同的行(比如1971年的
(G01S, G01S))都被标记为0
内容的提问来源于stack exchange,提问作者Amleto
相关产品推荐
相关产品推荐

