1
  • 我有一个具有 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 替换
所有 ee 值由 Mr 替换
所有 ff 值由 oZ 替换
所有 gg 值由 kZ 替换
所有 1 值由 fe 替换
所有 air 值由 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中是否有任何基本功能可以实现?有没有比这更好的方法来屏蔽数据?

4

2 回答 2

1

我建议使用merge(),但要做到这一点,您首先需要添加一个 unique data$idto的列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$idreplacements

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

然后datareplacementsusing合并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
于 2017-12-19T10:56:34.023 回答
1
  • 使用算法屏蔽数据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 中的数据匿名化

于 2018-01-05T04:44:20.510 回答