我使用的一些数据包含敏感信息(人名,日期,地点等)。但我有时需要与其他人分享“数字”以获得统计分析的帮助,或者在更强大的机器上处理它,在那里我无法控制谁查看数据。
理想情况下,我想这样工作:
我认为这在上传数据以便“在云端”(亚马逊等)进行处理时也很有用。
你有过这种情况吗?我首先想到自己编写一个“随机化”功能,但后来我意识到这可以做到多么复杂(例如,在不丢失顺序的情况下抵消时间戳)。也许已经有一个已定义的方法或工具?
感谢所有在Stack Overflow上为[r] -tag做出贡献的人!
答案 0 :(得分:3)
执行此操作的一种方法是使用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
然后我做了一把钥匙:
set.seed(100)
key <- as.character(foo$person[sample(1:nrow(foo))])
你必须明显地保存这个键。现在我可以对这些人进行编码:
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
如果我想再次使用此人名,我可以为key
编制索引:
key[foo$person]
[1] "Mickey" "Donald" "Daisy" "Scrooge"
或者使用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
答案 1 :(得分:3)
您可以简单地将GUID分配给已删除所有敏感信息的行吗?只要缺少安全许可的同事不会弄乱GUID,您就可以通过加入GUID来合并他们可能做出的任何更改和添加。然后,它就变成了为已清除数据的列生成伪造的ersatz值。 LastName1,LastName2,City1,City2等编辑:您有每个清除列的表,例如City,State,Zip,FirstName,LastName,每个包含该列中实际分类值的不同集合和整数值。因此,“琼斯”可以在清理数据集中表示为,例如,LastName22,“Schenectady”作为City343,“90210”作为Zipcode716。这将为您的同事提供有效的值(例如,他们与您的真实数据具有相同数量的不同城市,仅使用匿名名称)并且保留匿名数据的相互关系。编辑2:如果目标是为您的同事提供具有统计意义的清理数据,然后日期列需要特殊处理。例如。如果你的同事需要对这个人的年龄进行统计计算,你必须给他们一些接近原始日期的东西,不要太接近它可能揭示的东西,但不能到目前为止它可能会扭曲分析。
答案 2 :(得分:3)
听起来像统计披露控制问题。看一下sdcMicro包。
编辑:刚刚意识到你的问题略有不同。统计披露控制的要点是“破坏”数据,以降低披露风险。通过“破坏”数据,您将丢失一些信息 - 这是您为降低披露风险而支付的价格。您的数据将包含较少的信息 - 因此您的分析可以在对原始数据进行分析时给出不同或更少的结果。取决于您将如何处理数据。