如何对数据进行去除和重新分类?

时间:2011-02-21 14:05:04

标签: r

我使用的一些数据包含敏感信息(人名,日期,地点等)。但我有时需要与其他人分享“数字”以获得统计分析的帮助,或者在更强大的机器上处理它,在那里我无法控制谁查看数据。

理想情况下,我想这样工作:

  1. 将数据读入R(查看,清理等)
  2. 选择我要取消分类的数据框,通过包运行它并接收两个“文件”:解除分类的数据和翻译文件。后者我会保留自己。
  3. 可以无需担心地分享,处理和处理去分类数据。
  4. 我将处理后的数据与翻译文件重新分类。
  5. 我认为这在上传数据以便“在云端”(亚马逊等)进行处理时也很有用。

    你有过这种情况吗?我首先想到自己编写一个“随机化”功能,但后来我意识到这可以做到多么复杂(例如,在不丢失顺序的情况下抵消时间戳)。也许已经有一个已定义的方法或工具?

    感谢所有在Stack Overflow上为[r] -tag做出贡献的人!

3 个答案:

答案 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包。

编辑:刚刚意识到你的问题略有不同。统计披露控制的要点是“破坏”数据,以降低披露风险。通过“破坏”数据,您将丢失一些信息 - 这是您为降低披露风险而支付的价格。您的数据将包含较少的信息 - 因此您的分析可以在对原始数据进行分析时给出不同或更少的结果。

取决于您将如何处理数据。