按组检查某个值是否再次出现

问题描述 投票:0回答:2

我在R工作

样本数据:

我的一些人的 ID 是从他们的社会保障/国民保险号码 (actual_id) 中分配的。假定实际_id 是正确的。

这一栏可能不需要,但我已经算出了每个人在数据中出现的次数(数字)。例如我们可以看到actual_id = 1的人在数据中出现了两次,所以这个人的number = 2。

我创建了一种新的身份识别方法,与社会保障/国民保险号码无关。新方法生成了一个 id,位于 suggest_id 列中。

df <- data.frame(actual_id = c(1, 1, 2, 2, 2, 3, 3), 
                 proposed_id = c("a", "a", "b", "b", "c", "d", "b"), 
                 number = c(2, 2, 3, 3, 3, 2, 2))

print(df)

实际_id 数字 提议的_id
1 2 a
1 2 a
2 3 b
2 3 b
2 3 c
3 2 d
3 2 b

期望的结果

我想要一种方法来评估提议的_id 是否仅对任何实际_id 使用一次:

  • 我们可以看到proposal_id = a已经被分配给actual_id = 1,并且不再出现在proposal_id列中。因此,这将被分配为“TRUE”。
  • 我们可以看到proposal_id = b已被分配给actual_id = 2,但随后又被进一步分配到proposal_id = 3。这将被分配为“FALSE”。

我的实际数据有 90,000 行。

实际_id 数字 提议的_id 评估
1 2 a 正确
1 2 a 正确
2 3 b 错误
2 3 b 错误
2 3 c 正确
3 2 d 正确
3 2 b 错误
r duplicates unique
2个回答
1
投票

基础R

with(df, ave(actual_id, proposed_id, FUN = function(z) length(unique(z)) == 1)) > 0
# [1]  TRUE  TRUE FALSE FALSE  TRUE  TRUE FALSE

dplyr

library(dplyr)
df %>%
  mutate(assessment = n_distinct(actual_id) == 1, .by = proposed_id)
#   actual_id proposed_id number assessment
# 1         1           a      2       TRUE
# 2         1           a      2       TRUE
# 3         2           b      3      FALSE
# 4         2           b      3      FALSE
# 5         2           c      3       TRUE
# 6         3           d      2       TRUE
# 7         3           b      2      FALSE

数据表

library(data.table)
as.data.table(df)[, assessment := uniqueN(actual_id) == 1, by = "proposed_id"][]
#    actual_id proposed_id number assessment
#        <num>      <char>  <num>     <lgcl>
# 1:         1           a      2       TRUE
# 2:         1           a      2       TRUE
# 3:         2           b      3      FALSE
# 4:         2           b      3      FALSE
# 5:         2           c      3       TRUE
# 6:         3           d      2       TRUE
# 7:         3           b      2      FALSE

样本数据

df <- structure(list(actual_id = c(1, 1, 2, 2, 2, 3, 3), proposed_id = c("a", "a", "b", "b", "c", "d", "b"), number = c(2, 2, 3, 3, 3, 2, 2)), class = "data.frame", row.names = c(NA, -7L))

0
投票

你可以试试

transform(
    df,
    assessment = !ave(actual_id, proposed_id, FUN = \(x) diff(range(x)))
)

这给出了

  actual_id proposed_id number assessment
1         1           a      2       TRUE
2         1           a      2       TRUE
3         2           b      3      FALSE
4         2           b      3      FALSE
5         2           c      3       TRUE
6         3           d      2       TRUE
7         3           b      2      FALSE
© www.soinside.com 2019 - 2024. All rights reserved.