You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 08:33:17