我如何按对象找到以R为基的给定值的索引?

w8ntj3qf  于 2023-03-10  发布在  其他
关注(0)|答案(2)|浏览(99)

这对您来说可能有点异想天开,因为类似的问题在dplyr中很容易解决,但我仍然想知道如何解决,为了说明这一点,假设我正在查看雇员数据,目标是找出给定的雇员-日期对有多少条记录。

# Mockup employee data
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)
)

# By object counts rows for each unique employee-date pair
out <- by(
    data = df,
    INDICES = df[, c("win", "record_date")],
    FUN = nrow
)

现在的任务是查找计算出的行数大于1的所有雇员-日期对。我在Web上还找不到答案,“by”是一个不好的搜索词。我可以做如下操作:

out>1
#          record_date
# person_id 2020-01-01
#         1       TRUE
#         2      FALSE

但我不确定如何获得(1,“2020-01-01”)。

balp4ylt

balp4ylt1#

您可以使用ave

transform(df, flag=ave(person_id, person_id, record_date, FUN=\(x) length(x) > 1))
#   person_id record_date salary flag
# 1         1  2020-01-01    100    1
# 2         2  2020-01-01    110    0
# 3         1  2020-01-01    109    1

您也可以在subset中使用它。

subset(df, ave(person_id, person_id, record_date, FUN=\(x) length(x) > 1) == 1)
#   person_id record_date salary
# 1         1  2020-01-01    100
# 3         1  2020-01-01    109

注意,ave在内部使用by

wwwo4jvm

wwwo4jvm2#

如果您只希望person / id组合具有多个记录,则可以执行以下操作

subset(as.data.frame(with(df, table(person_id, record_date))), Freq > 1)
#>   person_id record_date Freq
#> 1         1  2020-01-01    2

或者,如果您想要所有计数,只需删除subset

as.data.frame(with(df, table(person_id, record_date)))
#>   person_id record_date Freq
#> 1         1  2020-01-01    2
#> 2         2  2020-01-01    1

相关问题