【问题标题】:R - Group by variable and then assign a unique ID [duplicate]R - 按变量分组,然后分配一个唯一的 ID [重复]
【发布时间】:2017-01-31 17:00:14
【问题描述】:

我有兴趣对具有时间固定值和时变值的敏感数据集进行去标识化。我想 (a) 按社会保险号对所有案例进行分组,(b) 为这些案例分配一个唯一 ID,然后 (c) 删除社会保险号。

这是一个示例数据集:

personal_id    gender  temperature
111-11-1111      M        99.6
999-999-999      F        98.2
111-11-1111      M        97.8
999-999-999      F        98.3
888-88-8888      F        99.0
111-11-1111      M        98.9

非常感谢任何解决方案。

【问题讨论】:

  • 也许是一个懒惰的解决方案,但我想你可以散列社会安全号码。
  • 一种方法是set.seed(1234); levels(personal_id) <- sample(length(levels(personal_id))) 在这里,种子会提供一个“解密”密钥,所以你要么隐藏它,要么不保存它。

标签: r dplyr


【解决方案1】:

dplyr 具有用于创建唯一组 ID 的 group_indices 函数

library(dplyr)
data <- data.frame(personal_id = c("111-111-111", "999-999-999", "222-222-222", "111-111-111"),
                       gender = c("M", "F", "M", "M"),
                       temperature = c(99.6, 98.2, 97.8, 95.5))

data$group_id <- data %>% group_indices(personal_id) 
data <- data %>% select(-personal_id)

data
  gender temperature group_id
1      M        99.6        1
2      F        98.2        3
3      M        97.8        2
4      M        95.5        1

或在同一管道内 (https://github.com/tidyverse/dplyr/issues/2160):

data %>% 
    mutate(group_id = group_indices(., personal_id))

【讨论】:

  • 不幸的是,group_indices() 在创建 group_id 之前似乎会自动对personal_id 进行排序,这并不总是需要的。
  • group_indices() 在 dplyr 1.0.0 中已弃用。现在请改用cur_group_id()
【解决方案2】:

dplyr::group_indices()dplyr 1.0.0 起已弃用。应该改用dplyr::cur_group_id()

df %>%
 group_by(personal_id) %>%
 mutate(group_id = cur_group_id())

  personal_id gender temperature group_id
  <chr>       <chr>        <dbl>    <int>
1 111-11-1111 M             99.6        1
2 999-999-999 F             98.2        3
3 111-11-1111 M             97.8        1
4 999-999-999 F             98.3        3
5 888-88-8888 F             99          2
6 111-11-1111 M             98.9        1

【讨论】:

  • 这应该是新接受的答案!
【解决方案3】:

使用 dplyr 包:

library(dplyr)
data <- data.frame(personal_id = c("111-111-111", "999-999-999", "222-222-222", "111-111-111"),
                 gender = c("M", "F", "M", "M"),
                 temperature = c(99.6, 98.2, 97.8, 95.5))

首先您提取personal_id 以创建唯一ID:

cases <- data.frame(levels = levels(data$personal_id))

使用行名,你会得到一个唯一的标识符:

cases <- cases %>%
    mutate(id = rownames(cases))

结果:

       levels id
1 111-111-111  1
2 222-222-222  2
3 999-999-999  3

然后您将案例数据框与您的数据一起加入:

data <- left_join(data, cases, by = c("personal_id" = "levels"))

您可以通过粘贴使用性别生成的 id 创建一个更独特的 ID:

mutate(UID = paste(id, gender, sep=""))

最后删除personal_id和simple id:

select(-personal_id, -id)

你去吧:) :

data <- left_join(data, cases, by = c("personal_id" = "levels")) %>%
        mutate(UID = paste(id, gender, sep="")) %>%
        select(-personal_id, -id)

结果:

  gender temperature UID
1      M        99.6  1M
2      F        98.2  3F
3      M        97.8  2M
4      M        95.5  1M

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-06
    • 2021-07-13
    • 1970-01-01
    相关资源
    最近更新 更多