我有大量的SPSS文件,我需要生成看起来像文件中数据的随机数据。
当我读取 SPSS 文件(使用haven
的read_sav
)时,它们带有变量和值标签(来自标签),我希望每个变量在加扰数据后写入 SPSS 文件时都具有相同的属性。但是,当我独立加扰每列的序列时,sapply
会剥离 Labelled 属性(因为它返回了一个我强制进入data.frame
的矩阵)。
如何在不剥离这些属性的情况下执行此操作?请参阅以下示例:
dat<-data.frame(a=c(1,2,3,4,5,6,7,8,9,10),b=c("a","b","c","d","e","f","g","h","i","j"))
var_label(dat$a)<-"The first variable"
val_labels(dat$a)<-c(first=1,
second=2,
third=3,
fourth=4,
fifth=5,
sixth=6,
seventh=7,
eighth=8,
ninth=9,
tenth=10)
var_label(dat$b)<-"The second variable"
# Variable has variable and value labels
dat$a
faker<-function(thing){
thing<-sample(thing,length(thing),replace=TRUE)
thing
}
rat<-as.data.frame(sapply(dat,faker))
# Variable no longer has variable and value labels
rat$a
编辑以更正代码最后一行的拼写错误,该拼写错误是 dat$a,应该是 rat$a
(首先,我假设你对rat
的重新分配应该真的是dat
,否则它不可重现,也不应该是,因为dat
在形成rat
时没有改变。
您对sapply
的使用是同质化和简化数据,切换到lapply
。
# ...
dat<-as.data.frame(sapply(dat,faker))
dat$a
# [1] "1" "7" "5" "7" "10" "2" "1" "4" "9" "4"
修复,
dat <- as.data.frame(lapply(dat,faker))
dat$a
# <labelled<double>[10]>: The first variable
# [1] 2 3 8 9 8 5 5 10 1 3
# Labels:
# value label
# 1 first
# 2 second
# 3 third
# 4 fourth
# 5 fifth
# 6 sixth
# 7 seventh
# 8 eighth
# 9 ninth
# 10 tenth
旁注:当将某些内容应用于框架的所有列时,而不是dat <- as.data.frame(lapply(...))
,我倾向于使用dat[] <- lapply(...)
,因为它保留了框架的属性并替换/增加了列的内容。
# ...
dat[] <- lapply(dat, faker)
dat$a
# <labelled<double>[10]>: The first variable
# [1] 4 8 7 7 9 7 9 1 3 5
# Labels:
# value label
# 1 first
# 2 second
# 3 third
# 4 fourth
# 5 fifth
# 6 sixth
# 7 seventh
# 8 eighth
# 9 ninth
# 10 tenth