如果您想要做的只是用匿名标签替换列名,同样地替换因子级别,是的。首先使用一些虚拟数据作为示例
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 = "")))
要替换列名,请执行以下操作:
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