r语言 - 跨列运行函数,而不剥离标记的属性



我有大量的SPSS文件,我需要生成看起来像文件中数据的随机数据。

当我读取 SPSS 文件(使用havenread_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

最新更新