Маскировка данных в Dataframe
У меня есть датафрейм с 8 уникальными значениями
data<-data.frame(id=c("ab","cc","cc","dd","ee","ff","ee","ff","ab","dd","gg",1,"air")) >data id 1 ab 2 cc 3 cc 4 dd 5 ee 6 ff 7 ee 8 ff 9 ab 10 dd 11 gg 12 1 13 air
Я создаю другой фрейм данных, содержащий 8 уникальных значений, которые будут использоваться в качестве замены
library(random) replacements<-data.frame(value=randomStrings(n=8, len=2, digits=FALSE,loweralpha=TRUE, unique=TRUE, check=TRUE)) replacements V1 1 SJ 2 fH 3 TZ 4 Mr 5 oZ 6 kZ 7 fe 8 ql
Я хочу заменить все уникальные значения из
data dataframe
со значениями вreplacement dataframe
ниже пути
Все значения ab заменены на SJ
Все значения cc заменены на fH
Все значения dd заменены на TZ
Все ее значения заменены на Mr
Все значения ff заменены на oZ
Все значения gg заменены на kZ
Все 1 значения заменены на fe
Все значения воздуха заменены на ql
В настоящее время я достигаю этого путем:
data<-data.frame(id=c("ab","cc","cc","dd","ee","ff","ee","ff","ab","dd","gg",1,"air")) data$id<-as.character(data$id) replacements<-data.frame(value=randomStrings(n=8, len=2, digits=FALSE,loweralpha=TRUE, unique=TRUE, check=TRUE)) replacements$V1<-as.character(replacements$V1) for(i in 1:length(unique(data$id))){ data$id[data$id %in% data$id[i]] <- replacements$V1[i] } >data id 1 SJ 2 fH 3 fH 4 TZ 5 Mr 6 oZ 7 Mr 8 oZ 9 SJ 10 TZ 11 kZ 12 fe 13 ql
Есть ли базовая функция в R для достижения? Есть ли лучший подход для маскировки данных, чем этот?
2 ответа
Маскировка данных с использованием алгоритма
CRC32
library(data.table) library(digest) data<-data.frame(id=c("ab","cc","cc","dd","ee","ff","ee","ff","ab","dd","gg",1,"air")) setDT(data) anonymize <- function(x, algo="crc32"){ unq_hashes <- vapply(unique(x), function(object) digest(object, algo=algo), FUN.VALUE="", USE.NAMES=TRUE) unname(unq_hashes[x]) } cols_to_mask <- c("id") data[,cols_to_mask := lapply(.SD, anonymize),.SDcols=cols_to_mask,with=FALSE]
Список литературы: Анонимность данных в R
Я бы предложил использовать merge()
, но для этого сначала нужно добавить столбец уникальных data$id
в replacements
, так как оба data.frames должны иметь общий столбец.
Вот data
:
> data
id
1 ab
2 cc
3 cc
4 dd
5 ee
6 ff
7 ee
8 ff
9 ab
10 dd
11 gg
12 1
13 air
Вот replacements
:
> replacements
V1
1 VS
2 Of
3 bH
4 iJ
5 jm
6 kH
7 cm
8 rQ
Так что добавьте уникальный data$id
в replacements
:
replacements$id <- unique(data$id)
Предоставление:
V1 id
1 VS ab
2 Of cc
3 bH dd
4 iJ ee
5 jm ff
6 kH gg
7 cm 1
8 rQ air
Затем объединить data
с replacements
с помощью id
:
data <- merge(data, replacements, by = "id", all.x = TRUE, sort = FALSE)
Предоставление:
id V1
1 ab VS
2 ab VS
3 cc Of
4 cc Of
5 dd bH
6 dd bH
7 ee iJ
8 ee iJ
9 ff jm
10 ff jm
11 gg kH
12 1 cm
13 air rQ
Если вы действительно хотите сохранить только новый id
колонка, вы можете уронить оригинал id
и переименуйте новый столбец:
data <- data[, 2, drop = FALSE]
colnames(data) <- "id"
Предоставление:
id
1 VS
2 VS
3 Of
4 Of
5 bH
6 bH
7 iJ
8 iJ
9 jm
10 jm
11 kH
12 cm
13 rQ