我使用的一些数据包含敏感信息(人员姓名,日期,地点等).但我有时需要与其他人分享"数字"以获得统计分析的帮助,或者在更强大的机器上处理它,在那里我无法控制谁看数据.
理想情况下,我想这样工作:
我认为这在上传数据以便"在云端"(亚马逊等)进行处理时也很有用.
你有过这种情况吗?我首先想到自己编写一个"随机化"功能,但后来我意识到这可以做到多么复杂(例如,在不丢失顺序的情况下抵消时间戳).也许已经有一个定义的方法或工具?
感谢所有在Stack Overflow为[r] -tag做出贡献的人!
一种方法是使用match. 首先我制作一个小数据框:
foo <- data.frame( person=c("Mickey","Donald","Daisy","Scrooge"), score=rnorm(4))
foo
person score
1 Mickey -0.07891709
2 Donald 0.88678481
3 Daisy 0.11697127
4 Scrooge 0.31863009
Run Code Online (Sandbox Code Playgroud)
然后我制作一个密钥:
set.seed(100)
key <- as.character(foo$person[sample(1:nrow(foo))])
Run Code Online (Sandbox Code Playgroud)
显然你必须把这个密钥保存在某个地方。现在我可以对人进行编码:
foo$person <- match(foo$person, key)
foo
person score
1 2 0.3186301
2 1 -0.5817907
3 4 0.7145327
4 3 -0.8252594
Run Code Online (Sandbox Code Playgroud)
如果我再次想要人名,我可以索引key:
key[foo$person]
[1] "Mickey" "Donald" "Daisy" "Scrooge"
Run Code Online (Sandbox Code Playgroud)
或者使用tranform,如果数据发生更改,只要人员 ID 保持不变,这也有效:
foo <-rbind(foo,foo[sample(1:4),],foo[sample(1:4,2),],foo)
foo
person score
1 2 0.3186301
2 1 -0.5817907
3 4 0.7145327
4 3 -0.8252594
21 1 -0.5817907
41 3 -0.8252594
31 4 0.7145327
15 2 0.3186301
32 4 0.7145327
16 2 0.3186301
11 2 0.3186301
12 1 -0.5817907
13 4 0.7145327
14 3 -0.8252594
transform(foo, person=key[person])
person score
1 Mickey 0.3186301
2 Donald -0.5817907
3 Daisy 0.7145327
4 Scrooge -0.8252594
21 Donald -0.5817907
41 Scrooge -0.8252594
31 Daisy 0.7145327
15 Mickey 0.3186301
32 Daisy 0.7145327
16 Mickey 0.3186301
11 Mickey 0.3186301
12 Donald -0.5817907
13 Daisy 0.7145327
14 Scrooge -0.8252594
Run Code Online (Sandbox Code Playgroud)