如何从私人数据创build示例数据集(使用不具名的占位符replacevariables名称和级别)?

为了提供一个方法的可重复的例子,必须经常提供数据集。 我不想构build一个示例数据集,而是希望使用我自己的一些数据。 但是这个数据不能被释放。 我希望用无意义的占位符(例如V1 …. V5,L1 …. L5)replacevariables(列)名称和因子级别。

是一个自动的方式来做到这一点?

理想情况下,这将在R中完成,接收dataframe并生成这个匿名dataframe。

有了这样的数据集,只需在脚本中search并replacevariables名称,就可以得到一个可公开释放的可重复的示例。

这样的过程可能会增加适当的数据在可复制的例子中,甚至在问题,评论和错误报告中包含可重复的例子。

我不知道是否有自动化的function,但现在有;)

## A function to anonymise columns in 'colIDs' ## colIDs can be either column names or integer indices anonymiseColumns <- function(df, colIDs) { id <- if(is.character(colIDs)) match(colIDs, names(df)) else colIDs for(id in colIDs) { prefix <- sample(LETTERS, 1) suffix <- as.character(as.numeric(as.factor(df[[id]]))) df[[id]] <- paste(prefix, suffix, sep="") } names(df)[id] <- paste("V", id, sep="") df } ## A data.frame containing sensitive information df <- data.frame( name = rep(readLines(file.path(R.home("doc"), "AUTHORS"))[9:13], each=2), hiscore = runif(10, 99, 100), passwd = replicate(10, paste(sample(c(LETTERS, letters), 9), collapse=""))) ## Anonymise it df2 <- anonymiseColumns(df, c(1,3)) ## Check that it worked > head(df, 3) name hiscore passwd 1 Douglas Bates 99.96714 ROELIAncz 2 Douglas Bates 99.07243 gDOLNMyVe 3 John Chambers 99.55322 xIVPHDuEW > head(df2, 3) name hiscore V3 1 Q1 99.96714 V8 2 Q1 99.07243 V2 3 Q2 99.55322 V9 

如果你想要做的只是用匿名标签replace列名,而且同样的因素水平,是的。 首先以一些虚拟数据为例

 dat <- data.frame(top_secret1 = rnorm(10), top_secret2 = runif(10), top_secret3 = factor(sample(3, 10, replace = TRUE), labels = paste("Person", 1:3, sep = ""))) 

要replace列名,请执行以下操作:

 dat2 <- dat colnames(dat2) <- paste("Variable", seq_len(ncol(dat2)), sep = "") 

这使

 > head(dat2) Variable1 Variable2 Variable3 1 -0.4858656 0.4846700 Person3 2 0.2660125 0.1727989 Person1 3 0.1595297 0.6413984 Person2 4 1.1952239 0.1892749 Person3 5 0.3914285 0.6235119 Person2 6 0.3752015 0.7057372 Person3 

接下来改变关卡

 foo <- function(x) { if(is.factor(x)) { levels(x) <- sample(LETTERS, length(levels(x))) } x } dat3 <- data.frame(lapply(dat2, foo)) 

这使

 > head(dat3) Variable1 Variable2 Variable3 1 -0.4858656 0.4846700 K 2 0.2660125 0.1727989 G 3 0.1595297 0.6413984 O 4 1.1952239 0.1892749 K 5 0.3914285 0.6235119 O 6 0.3752015 0.7057372 K 

foo()只是一个简单的包装函数,通过向量检查是否是一个因素,如果是,更改级别为适当长度的随机字母向量,然后返回向量。

我们可以将其封装到一个函数中来完成所有需要的更改

 anonymise <- function(df, colString = "Variable", rowString = "Sample") { foo <- function(x) { if(is.factor(x)) { levels(x) <- sample(LETTERS, length(levels(x))) } x } ## replace the variable names colnames(df) <- paste(colString, seq_len(ncol(df)), sep = "") ## fudge any factor levels df <- data.frame(lapply(df, foo)) ## replace rownames rownames(df) <- paste(rowString, seq_len(nrow(df)), sep = "") ## return df } 

这在使用中给出

 > anonymise(dat) Variable1 Variable2 Variable3 Sample1 -0.48586557 0.4846700 F Sample2 0.26601253 0.1727989 L Sample3 0.15952973 0.6413984 N Sample4 1.19522395 0.1892749 F Sample5 0.39142851 0.6235119 N Sample6 0.37520154 0.7057372 F Sample7 1.18440762 0.7355211 F Sample8 0.03605239 0.3924925 L Sample9 -0.64078219 0.4579347 N Sample10 -1.39680109 0.9047227 L 

这是我的版本的function。 优点:没有for循环,级别标签匹配variables标签,可以应用于任何df,超过26个字母的有序variables名称,数字variables的规范化…

感谢去:
@Tyler Rinker提供一个解决scheme来使用应用函数中的列名
@Josh O'Brien对这个问题的回答

它在这里是一个要点。

来自@Josh O'Brien的数据与一个非因素variables

  df <- data.frame( name = rep(readLines(file.path(R.home("doc"), "AUTHORS"))[9:13], each=2), hiscore = runif(10, 99, 100), passwd = replicate(10, paste(sample(c(LETTERS, letters), 9), collapse=""))) df$passwd<-as.character(df$passwd) 

function

 anonym<-function(df){ if(length(df)>26){ LETTERS<-replicate(floor(length(df)/26),{LETTERS<-c(LETTERS, paste(LETTERS, LETTERS, sep=""))}) } names(df)<-paste(LETTERS[1:length(df)]) level.id.df<-function(df){ level.id<-function(i){ if(class(df[,i])=="factor" | class(df[,i])=="character"){ column<-paste(names(df)[i],as.numeric(as.factor(df[,i])), sep=".")}else if(is.numeric(df[,i])){ column<-df[,i]/mean(df[,i], na.rm=T)}else{column<-df[,i]} return(column)} DF <- data.frame(sapply(seq_along(df), level.id)) names(DF) <- names(df) return(DF)} df<-level.id.df(df) return(df)} anonym(df) 

结果:

  ABC 1 A.1 1.00492190370171 C.8 2 A.1 0.997214883153158 C.2 3 A.2 1.00532434407094 C.5 4 A.2 1.00015775550051 C.6 5 A.3 0.998947207241593 C.3 6 A.3 0.998083738806433 C.4 7 A.5 1.00322085765279 C.7 8 A.5 0.995853096468764 C.1 9 A.4 0.998662338687036 C.10 10 A.4 0.99761387471706 C.9