Определение данных и создание пешеходного перехода с использованием duawranglr в R - PullRequest
0 голосов
/ 05 февраля 2020

Я пытаюсь деидентифицировать данные, используя пакет duawranglr в R, представленный в этом примере: https://cran.r-project.org/web/packages/duawranglr/vignettes/securing_data.html.

В качестве примера я создал фрейм данных:

 data <- data.frame(
        Name = c("Kate", "Jane", "Rod", "Jan", "Martin"),
        V1 = c(16, 20, 34, 25, 26),
        V2 = c(3, 7, 5, 3, 2)
        )

Я пытаюсь создать уникальные шестнадцатеричные строки без пешеходного перехода, которые соответствуют столбцу Name, используя функцию deid_dua.

data <- deid_dua(data, id_col = "Name", new_id_name = "DID", write_crosswalk = TRUE, id_length = 12)

Ошибка, которую я продолжаю получать:

Error in data.frame(old = old_ids, new = new_ids, stringsAsFactors = FALSE) : 
  arguments imply differing number of rows: 5, 0 

Сначала я подумал, что проблема в том, что столбец имени является фактором. Тем не менее, я получаю ту же ошибку после преобразования его в символ с помощью инструкции stringsAsFactors = FALSE в data.frame. Я также не уверен, основываясь на примере CRAN, нужны ли мне эти утверждения:

admin_file <- system.file('extdata', 'admin_data.csv', package = 'duawranglr')
df <- read_dua_file(admin_file)
df

Применяются ли они, если вы не импортируете данные? Пример не очень хорошо объясняет, для чего они.

Ответы [ 3 ]

1 голос
/ 06 февраля 2020

Вот гораздо более простое решение:

# create a custom 8-digit random identifier string called ID:
library(stringi)
data$ID <- stri_rand_strings(nrow(data), 8)

# remove the name column to create a de-identified dataset
data_deidentified <- data[,-1]

Ваш фрейм data_deidentified будет выглядеть примерно так:

  V1 V2       ID
1 16  3 V2Hziep8
2 20  7 vFeQW1OQ
3 34  5 E5vcWYfm
4 25  3 VLbHzU3H
5 26  2 acCbXiO1

И, очевидно, сохранит исходный фрейм данных в качестве пешеходного перехода. Вы можете сделать переменную ID длиннее, изменив значение '8' в этом вызове.

Теперь, если у вас есть повторяющиеся имена в ваших данных, вам нужно будет сделать несколько дополнительных шагов:

# note that I've modified the original dataframe to include two "Martin" values:
data <- data.frame(Name = c("Kate", "Jane", "Rod", "Jan", "Martin", "Martin"),
                 V1 = c(16, 20, 34, 25, 26, 28),
                 V2 = c(3, 7, 5, 3, 2, 5))

# get list of unique names and convert to dataframe
names <- data.frame('Name' = unique(data$Name))
# assign ID string to each unique name
names$ID <- stri_rand_strings(nrow(names), 8)
# now merge back into original df
data <- merge(data, names)

Ваш результат:

    Name V1 V2       ID
1    Jan 25  3 e8da7lO4
2   Jane 20  7 pGeeklL1
3   Kate 16  3 5yYAtO9B
4 Martin 26  2 BwC6jPBh
5 Martin 28  5 BwC6jPBh
6    Rod 34  5 f3xvGbu2
1 голос
/ 05 февраля 2020

Я получаю сообщение об ошибке, если сначала не установил пешеходный переход, но это довольно тривиально:

library(duawranglr)

df <- data.frame(Name = c("Kate", "Jane", "Rod", "Jan", "Martin"),
                  V1 = c(16, 20, 34, 25, 26),
                  V2 = c(3, 7, 5, 3, 2))

# You only have a single column to obscure, so you only need a one-cell data frame to set up
set_dua_cw(data.frame(secure = "Name"))
#> -- duawranglr note -------------------------------------------------------------------
#> DUA crosswalk has been set!

# Simultaneously secure the data and write the crosswalk
df <- deid_dua(df,
               id_col = "Name",
               new_id_name = "ID",
               write_crosswalk = T,
               id_length = 12,
               crosswalk_filename = "cw.csv")

print(df)
#>             ID V1 V2
#> 1 950dce035280 16  3
#> 2 6b95d061b59f 20  7
#> 3 00a5d8ab2a4c 34  5
#> 4 ea03e704d806 25  3
#> 5 3eba984ebcba 26  2

И вы можете увидеть содержание пешеходного перехода, прочитав содержимое файла csv

read.csv("cw.csv")
#>     Name           ID
#> 1   Kate 950dce035280
#> 2   Jane 6b95d061b59f
#> 3    Rod 00a5d8ab2a4c
#> 4    Jan ea03e704d806
#> 5 Martin 3eba984ebcba

И если вы хотите вернуть имена в будущем, вы можете сделать:

cw <- read.csv("cw.csv")
df$Name <- cw$Name[match(cw$ID, df$ID)]
0 голосов
/ 14 апреля 2020

Я немного опоздал, но как автор пакета, я постараюсь прояснить некоторую путаницу.

tl; dr

Ответ @Allan Cameron дал мне работу , но если все, что вам нужно, это иметь sh ваши идентификаторы, то решение @ mh765, вероятно, является лучшим.

Более подробное объяснение цели duawranglr

duawranglr предполагает, что у вас ограниченный фрейм данных и что вы хотите сделать две вещи, чтобы вы могли поделиться ими:

  1. Удалить столбцы, которые содержат ограниченные элементы данных (например, DOB или другую идентифицирующую информацию)
  2. Преобразовать уникальные идентификаторы в другой уникальный идентификатор, который нельзя использовать для возврата в исходные идентификаторы (в случае, если исходные идентификаторы также ограничены, например, SSN)

Поскольку вы не пытаетесь сделать № 1, тогда смысл иметь пешеходный переход DUA, который имеет только один столбец с одним элементом: именем вашего столбца идентификатора (для @Allan Cameron).

Но допустим, у вас есть два возможных уровня безопасности, а на втором вы не можете включить V1. Тогда ваш пешеходный переход DUA может выглядеть следующим образом:

library(duawranglr)

## your data frame
df <- data.frame(Name = c("Kate", "Jane", "Rod", "Jan", "Martin"),
                   V1 = c(16, 20, 34, 25, 26),
                   V2 = c(3, 7, 5, 3, 2))

## create dua crosswalk
dua_cw <- data.frame(secure_level_i = c("Name",""), 
                     secure_level_ii = c("Name", "V1"))

## show cw (level_i won't allow name; level_ii won't allow name or V1)
dua_cw
  secure_level_i secure_level_ii
1           Name            Name
2                             V1

## set the dua cw
set_dua_cw(dua_cw)
-- duawranglr note -------------------------------------------------------------
DUA crosswalk has been set!

Теперь вы можете установить уровень безопасности. Допустим, вы установили secure_level_i, что означает, что можно сохранить V1 в последнем фрейме данных, которым вы делитесь:

## set DUA level
set_dua_level("secure_level_i", deidentify_required = TRUE, id_column = "Name")
-- duawranglr note -------------------------------------------------------------
Unique IDs in [ Name ] must be deidentified; use -deid_dua()-.

Теперь вы можете использовать deid_dua() так, как хотели sh ваши ID, в данном случае, имена.

## deidentify data (don't need to set id_col since we set it in set_dua_level)
df <- deid_dua(df, 
               new_id_name = "DID", 
               write_crosswalk = TRUE, 
               id_length = 12,
               crosswalk_filename = "cw.csv")

## show result
df
           DID V1 V2
1 d164bb624da2 16  3
2 a8b33e3b0230 20  7
3 a1d287cbdde7 34  5
4 1c00ba576e1a 25  3
5 a870564b3365 26  2

## show crosswalk
read.csv("cw.csv")

    Name          DID
1   Kate d164bb624da2
2   Jane a8b33e3b0230
3    Rod a1d287cbdde7
4    Jan 1c00ba576e1a
5 Martin a870564b3365

## check restrictions to see if you can save data
check_dua_restrictions(df)
-- duawranglr note -------------------------------------------------------------
Data set has passed check and may be saved.

Если, однако, вы set_dua_level() до "secure_level_ii", то вы не пройдете последнюю проверку, так как у вас все еще будет V1 в ваши данные.

## set new more secure level 
set_dua_level("secure_level_ii", deidentify_required = TRUE, id_column = "Name")
-- duawranglr note -------------------------------------------------------------
Unique IDs in [ Name ] must be deidentified; use -deid_dua()-.

## check again
check_dua_restrictions(df)
-- duawranglr note -------------------------------------------------------------
The following variables are not allowed at the current data usage level
restriction [ secure_level_ii ] and MUST BE REMOVED before saving:

 - V1

Чтобы перейти на новый уровень, вам нужно удалить V1 из вашего фрейма данных.

## drop
df$V1 <- NULL

## check again
check_dua_restrictions(df)
-- duawranglr note -------------------------------------------------------------
Data set has passed check and may be saved.

В качестве заключительного замечания, ваш id_col должен содержать уникальные идентификаторы. Имена работают в примере с игрушкой, потому что они уникальны, но, как отмечали другие, повторные имена для разных наблюдений не будут работать с duawranglr.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...