按列随机化数据表而不丢失属性或更改类型
Randomize datatable by column without losing attributes or changing type
我的目标是在不丢失与每一列关联的属性的情况下,按列随机化数据表中的值序列。每列应独立于其他列随机化。所以一个看起来像这样的数据集:
ID
height
weight
A
54
120
B
48
200
C
32
250
最终可能看起来像这样:
ID
height
weight
C
48
250
A
54
200
B
32
120
可复制的例子:
library(tidyverse)
library(labelled)
dat<-data.table(a=c(1,2,3,4,5),
b=c("one","two","three","four","five"),
c=c(10,9,8,7,6))
var_label(dat$a)<-"The a variable"
var_label(dat$b)<-"The b variable"
var_label(dat$c)<-"The c variable"
val_label(dat$a,1)<-"First option"
val_label(dat$a,2)<-"Second option"
val_label(dat$a,3)<-"Third option"
val_label(dat$a,4)<-"Fourth option"
val_label(dat$a,5)<-"Fifth option"
new_dat<-as.data.table(apply(dat,2,sample))
问题是这样的:
str(dat$a)
dbl+lbl [1:5] 1, 2, 3, 4, 5
@ labels: Named num [1:5] 1 2 3 4 5
..- attr(*, "names")= chr [1:5] "First option" "Second option" "Third option" "Fourth option" ...
@ label : chr "The a variable"
str(new_dat$a)
chr [1:5] "2" "3" "5" "4" "1"
我有一个中型数据集(约 10,000 行和约 250 列),我需要复制它,所以我真的不想要一个随机的解决方案。有没有一种方法可以做到这一点,而不涉及询问 dat 的每一列的结构并强制 new_dat 的每个匹配列进行匹配?提前致谢。
而不是使用 apply
(转换为 matrix
并且矩阵只能有一个 class)。使用 lapply
newdat <- copy(dat)
newdat[] <- lapply(newdat, sample)
-检查结构
str(newdat)
#Classes ‘data.table’ and 'data.frame': 5 obs. of 3 variables:
# $ a: dbl+lbl [1:5] 2, 3, 4, 5, 1
# ..@ labels: Named num 1 2 3 4 5
# .. ..- attr(*, "names")= chr [1:5] "First option" "Second option" "Third option" "Fourth option" ...
# ..@ label : chr "The a variable"
# $ b: chr "five" "three" "two" "one" ...
# $ c: num 6 10 8 7 9
或者另一个快速选项是 collapse
中的 dapply
(它确实保留了类型和属性)
library(collapse)
newdat <- dapply(newdat, sample)
如果数据集有更多一种类型(在不同的列中),实际上从不使用 apply
。
我的目标是在不丢失与每一列关联的属性的情况下,按列随机化数据表中的值序列。每列应独立于其他列随机化。所以一个看起来像这样的数据集:
ID | height | weight |
---|---|---|
A | 54 | 120 |
B | 48 | 200 |
C | 32 | 250 |
最终可能看起来像这样:
ID | height | weight |
---|---|---|
C | 48 | 250 |
A | 54 | 200 |
B | 32 | 120 |
可复制的例子:
library(tidyverse)
library(labelled)
dat<-data.table(a=c(1,2,3,4,5),
b=c("one","two","three","four","five"),
c=c(10,9,8,7,6))
var_label(dat$a)<-"The a variable"
var_label(dat$b)<-"The b variable"
var_label(dat$c)<-"The c variable"
val_label(dat$a,1)<-"First option"
val_label(dat$a,2)<-"Second option"
val_label(dat$a,3)<-"Third option"
val_label(dat$a,4)<-"Fourth option"
val_label(dat$a,5)<-"Fifth option"
new_dat<-as.data.table(apply(dat,2,sample))
问题是这样的:
str(dat$a)
dbl+lbl [1:5] 1, 2, 3, 4, 5
@ labels: Named num [1:5] 1 2 3 4 5
..- attr(*, "names")= chr [1:5] "First option" "Second option" "Third option" "Fourth option" ...
@ label : chr "The a variable"
str(new_dat$a)
chr [1:5] "2" "3" "5" "4" "1"
我有一个中型数据集(约 10,000 行和约 250 列),我需要复制它,所以我真的不想要一个随机的解决方案。有没有一种方法可以做到这一点,而不涉及询问 dat 的每一列的结构并强制 new_dat 的每个匹配列进行匹配?提前致谢。
而不是使用 apply
(转换为 matrix
并且矩阵只能有一个 class)。使用 lapply
newdat <- copy(dat)
newdat[] <- lapply(newdat, sample)
-检查结构
str(newdat)
#Classes ‘data.table’ and 'data.frame': 5 obs. of 3 variables:
# $ a: dbl+lbl [1:5] 2, 3, 4, 5, 1
# ..@ labels: Named num 1 2 3 4 5
# .. ..- attr(*, "names")= chr [1:5] "First option" "Second option" "Third option" "Fourth option" ...
# ..@ label : chr "The a variable"
# $ b: chr "five" "three" "two" "one" ...
# $ c: num 6 10 8 7 9
或者另一个快速选项是 collapse
中的 dapply
(它确实保留了类型和属性)
library(collapse)
newdat <- dapply(newdat, sample)
如果数据集有更多一种类型(在不同的列中),实际上从不使用 apply
。