Π― Π·Π½Π°Ρ, ΠΊΠ°ΠΊ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ ΡΡΠΎΠΉ ΠΎΡΠΈΠ±ΠΊΠΈ, Π½ΠΎ Ρ Π½Π΅ Π·Π½Π°Ρ, ΠΏΠΎΡΠ΅ΠΌΡ ΡΡΠ° ΠΎΡΠΈΠ±ΠΊΠ° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ, Π΅ΡΠ»ΠΈ Ρ Π·Π°ΠΏΡΡΠΊΠ°Ρ Π΅Π΅ ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ.
datain <- data.frame(
chrom = c("chr17", "chr4", "chr5", "chr13"),
map = c(81061047, 106061533, 40102442, 73791553),
rs = c("rs75954926", "rs7679673", "rs7708610", "rs78341008"),
start = c(79061048, 104061534, 38102443, 71791554),
end = c(83061048, 108061534, 42102443, 75791554)
)
datain
datain$chr<-datain$chrom
setDT(datain)
setkey(datain, chr, start, end)
datain
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ!
ΠΠ»Π΅ΠΊΡ
Π― ΠΌΠΎΠ³Ρ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅ΡΡΠΈ ΡΡΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ data.table 1.12.0 ΠΊΠ°ΠΊ Π² Windows 10, ΡΠ°ΠΊ ΠΈ Π² macOS 10.13.6. ΠΠΎΡΠ»Π΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΠΌΠΎΠ΅ΠΉ ΡΠΈΡΡΠ΅ΠΌΡ macOS tot data.table 1.12.2 Ρ ΠΌΠΎΠ³Ρ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠ΄ΠΈΡΡ, ΡΡΠΎ Π²ΡΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠ΅ Π½ΠΈΠΆΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ Π΄Π°ΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ.
ΠΠ΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΎΡΡΠΎΠΉ ΠΏΡΠΈΠΌΠ΅Ρ:
> set.seed(1)
> d <- data.frame(x = paste0("chr",sample(17)[3:6]), y = 1:4)
> d$x2 <- d$x
> d
x y x2
1 chr9 1 chr9
2 chr13 2 chr13
3 chr3 3 chr3
4 chr11 4 chr11
> setDT(d)
> setkey(d,x2,y)
> d
x y x2
1: chr9 4 chr9
2: chr13 2 chr13
3: chr3 3 chr3
4: chr11 1 chr11
ΠΡΠΎ ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ, ΠΊΠΎΠ³Π΄Π° Π²Ρ Π½Π°Π·Π½Π°ΡΠ°Π΅ΡΠ΅ ΠΊΠ»ΡΡ Π½Π°ΠΏΡΡΠΌΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ setDT
(ΡΠ΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΆΠΈΠ΄Π°ΡΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ setDT
ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ setkeyv
Π΄Π»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΊΠ»ΡΡΠ΅ΠΉ):
> set.seed(1)
> d <- data.frame(x = paste0("chr",sample(17)[3:6]), y = 1:4)
> d$x2 <- d$x
> d
x y x2
1 chr9 1 chr9
2 chr13 2 chr13
3 chr3 3 chr3
4 chr11 4 chr11
> setDT(d, key = c("x2","y"))
> d
x y x2
1: chr9 4 chr9
2: chr13 2 chr13
3: chr3 3 chr3
4: chr11 1 chr11
ΠΠ°ΠΊ Π²ΠΈΠ΄ΠΈΡΠ΅, ΠΏΠΎΡΡΠ΄ΠΎΠΊ ΡΡΠΎΠ»Π±ΡΠ° y
ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΡΡ, Π° ΠΏΠΎΡΡΠ΄ΠΎΠΊ Π΄ΡΡΠ³ΠΈΡ
ΡΡΠΎΠ»Π±ΡΠΎΠ² - Π½Π΅Ρ. ΠΠΎ-Π²ΠΈΠ΄ΠΈΠΌΠΎΠΌΡ, ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Π²Ρ ΠΊΠΎΠΏΠΈΡΡΠ΅ΡΠ΅ ΡΡΠΎΠ»Π±Π΅Ρ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ data.frame, Π·Π°ΡΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ setDT
Π° Π·Π°ΡΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ setkey
. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΏΡΡΡ ΡΠ»ΡΡΠ°Π΅Π², ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ
Π΄Π°Π΅Ρ ΠΆΠ΅Π»Π°Π΅ΠΌΡΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ:
1) Π½Π΅ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠΎΠ»Π±Π΅Ρ ΡΡΠ΅ΠΉΠΌΠ° Π΄Π°Π½Π½ΡΡ
> set.seed(1)
> d <- data.frame(x = paste0("chr",sample(17)[3:6]), y = 1:4)
> d
x y
1 chr9 1
2 chr13 2
3 chr3 3
4 chr11 4
> setDT(d)
> setkey(d,x)
> d
x y
1: chr11 4
2: chr13 2
3: chr3 3
4: chr9 1
2) ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΡΠΎΠ»Π±ΡΠ° Π² ΡΡΠ΅ΠΉΠΌΠ΅ Π΄Π°Π½Π½ΡΡ
> set.seed(1)
> d <- data.frame(x = paste0("chr",sample(17)[3:6]), y = 1:4)
> set.seed(1)
> d$x2 <- paste0("chr",sample(17)[1:4])
> d
x y x2
1 chr9 1 chr5
2 chr13 2 chr6
3 chr3 3 chr9
4 chr11 4 chr13
> setDT(d)
> setkey(d,x2,y)
> d
x y x2
1: chr11 4 chr13
2: chr9 1 chr5
3: chr13 2 chr6
4: chr3 3 chr9
3) ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΡΠΎΠ»Π±ΡΠ° ΠΏΡΡΠ΅ΠΌ Π²ΡΠ±ΠΎΡΠΊΠΈ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠ΅Π³ΠΎ ΡΡΠΎΠ»Π±ΡΠ° ΠΈ Π²ΡΡΠ°Π²ΠΊΠΈ Π² Π½Π΅Π³ΠΎ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² extr
> set.seed(1)
> d <- data.frame(x = paste0("chr",sample(17)[3:6]), y = 1:4)
> set.seed(1)
> d$x2 <- paste0("new_",sample(d$x,4))
> d
x y x2
1 chr9 1 new_chr13
2 chr13 2 new_chr11
3 chr3 3 new_chr3
4 chr11 4 new_chr9
> setDT(d)
> setkey(d,x2,y)
> d
x y x2
1: chr13 2 new_chr11
2: chr9 1 new_chr13
3: chr3 3 new_chr3
4: chr11 4 new_chr9
4) ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΡΠΎΠ»Π±ΡΠ° ΠΏΡΡΠ΅ΠΌ ΠΏΡΠΎΡΡΠΎΠΉ Π²ΡΠ±ΠΎΡΠΊΠΈ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠ΅Π³ΠΎ ΡΡΠΎΠ»Π±ΡΠ°
> set.seed(1)
> d <- data.frame(x = paste0("chr",sample(17)[3:6]), y = 1:4)
> set.seed(1)
> d$x2 <- sample(d$x,4)
> d
x y x2
1 chr9 1 chr13
2 chr13 2 chr11
3 chr3 3 chr3
4 chr11 4 chr9
> setDT(d)
> setkey(d,x2,y)
> d
x y x2
1: chr13 2 chr11
2: chr9 1 chr13
3: chr3 3 chr3
4: chr11 4 chr9
5) ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΠΎΠ»Π±ΡΠ° ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ data.table
> set.seed(1)
> d <- data.frame(x = paste0("chr",sample(17)[3:6]), y = 1:4)
> d
x y
1 chr9 1
2 chr13 2
3 chr3 3
4 chr11 4
> setDT(d)
> d[, x2 := x][]
x y x2
1: chr9 1 chr9
2: chr13 2 chr13
3: chr3 3 chr3
4: chr11 4 chr11
> setkey(d,x2,y)
> d
x y x2
1: chr11 4 chr11
2: chr13 2 chr13
3: chr3 3 chr3
4: chr9 1 chr9
Π₯ΠΎΡΡ ΡΡΠ° ΠΎΡΠΈΠ±ΠΊΠ°, ΠΊΠ°ΠΆΠ΅ΡΡΡ, Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ Π² (ΠΎΡΠ΅Π½Ρ) ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ, ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΊΡΠΈΡΠΈΡΠ½ΠΎΠΉ Π΄Π»Ρ ΠΌΠ΅Π½Ρ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ setkey
Π² Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½Π½ΡΡ
ΡΠΈΡΡΠ΅ΠΌΠ°Ρ
. ΠΡΠΎΠ²Π΅ΡΠΈΠΌ, Π²ΡΡΡΠ΅ΡΠ°Π΅ΡΡΡ Π»ΠΈ ΡΡΠΎΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ ΡΠ»ΡΡΠ°ΠΉ Π² ΠΌΠΎΠ΅ΠΌ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅.
ΠΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π°Ρ @jaapwalhout Β«s Π½Π°Π±Π»ΡΠ΄Π΅Π½ΠΈΡ (Ρ data.table_1.12.3).
ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, (i) Π΄ΡΠΌΠ°Π», ΡΡΠΎ ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ²ΡΠ·Π°Π½ΠΎ Ρ ΡΠ°ΠΊΡΠΎΡΠ°ΠΌΠΈ, Π½ΠΎ ΡΡΠΎ Π½Π΅ ΡΠ°ΠΊ (Π±ΡΠ²Π°Π΅Ρ ΡΠ°ΠΊΠΆΠ΅ Ρ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠΌ ΠΈΠ»ΠΈ ΡΠ΅Π»ΡΠΌ ΡΠΈΡΠ»ΠΎΠΌ), (ii) ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΠΊΠ»ΡΡΠ° (x ΠΈΠ»ΠΈ y).
ΠΠΈΠΆΠ΅ Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΎΡΡΠΎΠΉ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠΌΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ.
ΠΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π² Π·Π°Π΄Π°Π½ΠΈΠΈ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ²ΡΠ·Π°Π½ΠΎ, Π½ΠΎ Ρ Π½Π΅ ΡΠ²Π΅ΡΠ΅Π½, ΡΡΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ Π΅Π³ΠΎ.
options(datatable.verbose = TRUE)
## KO
d <- data.frame(x = c(9, 1), y = c(9, 1))
d$x2 <- d$x
d
# x y x2
# 1 9 9 9
# 2 1 1 1
setDT(d, key = "x")[]
# forder took 0 sec
# reorder took 0 sec
# x y x2
# 1: 9 1 9
# 2: 1 9 1
## KO
d <- data.frame(x = c("9", "1"), y = c(9, 1), stringsAsFactors = FALSE)
d$x2 <- d$x
d
# x y x2
# 1 9 9 9
# 2 1 1 1
setDT(d, key = "x")[]
# forder took 0 sec
# reorder took 0 sec
# x y x2
# 1: 9 1 9
# 2: 1 9 1
## OK (with warning)
d <- data.frame(x = c("9", "1"), y = c(9, 1))
setDT(d)
d$x2 <- d$x
# Assigning to all 2 rows
# RHS for item 1 has been duplicated because NAMED is 2, but then is being plonked. length(values)==2; length(cols)==1)
setkey(d, y, verbose = TRUE)[]
# forder took 0 sec
# reorder took 0 sec
# x y x2
# 1: 1 1 1
# 2: 9 9 9
iiuc, ΠΏΡΠΈ Π΄ΡΠ±Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΡΡΠΎΠ»Π±ΡΠ° ΠΈΠ»ΠΈ ΡΠΏΠΈΡΠΊΠ° Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π°Π΄ΡΠ΅Ρ ΠΏΠ°ΠΌΡΡΠΈ Π±ΡΠ΄Π΅Ρ ΡΠ°ΠΊΠΈΠΌ ΠΆΠ΅, ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΊΠ»ΡΡΠ° Β«ΠΈΡΠΏΠΎΡΡΠΈΡ Π΄Π΅Π»ΠΎΒ».
Π Π°Π±ΠΎΡΠ°Π΅Ρ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ copy()
.
# KO
l <- list(x = c(9, 1), y = c(9, 1))
l[["z"]] <- l[["x"]]
l
setDT(l, key = "x")[]
address(l$x) == address(l$z)
# TRUE
# OK
l <- list(x = c(9, 1), y = c(9, 1))
l[["z"]] <- copy(l[["x"]])
l
setDT(l, key = "x")[]
Π‘Π°ΠΌΡΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ
iiuc, ΠΏΡΠΈ Π΄ΡΠ±Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΡΡΠΎΠ»Π±ΡΠ° ΠΈΠ»ΠΈ ΡΠΏΠΈΡΠΊΠ° Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π°Π΄ΡΠ΅Ρ ΠΏΠ°ΠΌΡΡΠΈ Π±ΡΠ΄Π΅Ρ ΡΠ°ΠΊΠΈΠΌ ΠΆΠ΅, ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΊΠ»ΡΡΠ° Β«ΠΈΡΠΏΠΎΡΡΠΈΡ Π΄Π΅Π»ΠΎΒ».
Π Π°Π±ΠΎΡΠ°Π΅Ρ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ
copy()
.