Data.table: рдлрд╝рдВрдХреНрд╢рди рд╕реЗрдЯрдХреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐

рдХреЛ рдирд┐рд░реНрдорд┐рдд 9 рдЕрдкреНрд░реИрд▓ 2019  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: Rdatatable/data.table

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддреНрд░реБрдЯрд┐ рд╕реЗ рдХреИрд╕реЗ рдмрдЪрд╛ рдЬрд╛рдП, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЕрдЧрд░ рдореИрдВ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЪрд▓рд╛рддрд╛ рд╣реВрдВ рддреЛ рдпрд╣ рддреНрд░реБрдЯрд┐ рдХреНрдпреЛрдВ рд╣реЛрддреА рд╣реИред

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

рдзрдиреНрдпрд╡рд╛рдж!

рдПрд▓реЗрдХреНрд╕

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

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")[]

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореИрдВ рдЗрд╕реЗ рд╡рд┐рдВрдбреЛрдЬ 10 рдФрд░ рдореИрдХрдУрдПрд╕ 10.13.6 рджреЛрдиреЛрдВ рдкрд░ рдбреЗрдЯрд╛.рдЯреЗрдмрд▓ 1.12.0 рдХреЗ рд╕рд╛рде рдкреБрди: рдкреЗрд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдЕрдкрдиреЗ macOS рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдбреЗрдЯрд╛.рдЯреЗрдмрд▓ 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) рдореМрдЬреВрджрд╛ рдХреЙрд▓рдо рдХрд╛ рдирдореВрдирд╛ рд▓реЗрдХрд░ рдФрд░ рдЙрд╕рдореЗрдВ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдЪрд░рдЪрд░реНрд╕ рдЪрд┐рдкрдХрд╛рдХрд░ рдПрдХ рдирдпрд╛ рдХреЙрд▓рдо рдмрдирд╛рдирд╛

> 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) рдПрдХ рдХреЙрд▓рдо рдХреЛ рдбреЗрдЯрд╛ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдирд╛ред рддрд╛рд▓рд┐рдХрд╛ рддрд░реАрдХрд╛

> 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 рдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдкреБрд╖реНрдЯрд┐ (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")[]
рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

st-pasha picture st-pasha  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

franknarf1 picture franknarf1  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mattdowle picture mattdowle  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jangorecki picture jangorecki  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

nachti picture nachti  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ