如何在Base R中从by对象获取行数大于1的员工-日期对索引
在Base R中提取重复的员工-日期记录对
虽然这类问题用dplyr能轻松解决,但以下是在Base R中的实现方式:目标是统计每个员工-日期组合的记录数,并提取出记录数大于1的组合。
首先修正模拟数据与计数代码
你提供的原代码中by函数的INDICES参数里有笔误("win"应为"person_id"),修正后的代码如下:
# 模拟员工数据 df <- data.frame( person_id = c(1, 2, 1), record_date = as.Date(c("2020-01-01", "2020-01-01", "2020-01-01")), salary = c(100, 110, 109) ) # 统计每个员工-日期组合的记录数 out <- by( data = df, INDICES = df[, c("person_id", "record_date")], FUN = nrow )
执行out>1会得到逻辑判断结果,但要提取具体的员工-日期对,可以用以下几种方法:
方法1:将by结果转换为数据框后筛选
by的返回结果是数组,将其转为数据框后即可轻松筛选:
# 转换为带计数列的数据框 count_df <- as.data.frame(out, responseName = "count") # 提取记录数大于1的员工-日期对 duplicate_pairs <- count_df[count_df$count > 1, c("person_id", "record_date")] print(duplicate_pairs) # person_id record_date # 1 1 2020-01-01
方法2:用table函数统计后提取
table函数可直接生成交叉频数表,再转成数据框筛选:
# 生成员工-日期的频数表 count_table <- table(df$person_id, df$record_date) # 转换为数据框并重命名列 count_df <- as.data.frame(count_table, responseName = "count") names(count_df)[1:2] <- c("person_id", "record_date") # 筛选符合条件的组合 duplicate_pairs <- count_df[count_df$count > 1, ] print(duplicate_pairs) # person_id record_date count # 1 1 2020-01-01 2
方法3:用aggregate函数直接分组统计
aggregate是Base R中专门的分组统计工具,步骤更直观:
# 按员工和日期分组,统计每组行数 count_df <- aggregate(. ~ person_id + record_date, data = df, FUN = nrow) # 重命名计数列 names(count_df)[3] <- "count" # 提取记录数大于1的组合 duplicate_pairs <- count_df[count_df$count > 1, c("person_id", "record_date")] print(duplicate_pairs) # person_id record_date # 1 1 2020-01-01
内容的提问来源于stack exchange,提问作者mywholeidentity
相关产品推荐
相关产品推荐

