Saya tahu bagaimana menghindari kesalahan ini, tetapi saya tidak tahu mengapa kesalahan ini terjadi jika saya menjalankannya dengan cara ini.
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
Terima kasih!
Alex
Saya dapat mereproduksi ini dengan data.table 1.12.0 pada Windows 10 dan macOS 10.13.6. Setelah memutakhirkan sistem macOS saya tot data.table 1.12.2 Saya dapat mengonfirmasi bahwa semua contoh di bawah ini memberikan hasil yang sama.
Contoh yang lebih sederhana:
> 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
Ini juga terjadi ketika Anda menetapkan kunci secara langsung dengan setDT
(yang bisa diharapkan sebagai setDT
menggunakan setkeyv
untuk mengatur kunci):
> 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
Seperti yang Anda lihat, urutan kolom y
berubah, sedangkan urutan kolom lainnya tidak. Rupanya ini hanya terjadi ketika Anda menyalin kolom dengan cara data.frame, kemudian menggunakan setDT
dan kemudian menggunakan setkey
. Pertimbangkan lima kasus berikut yang semuanya memberikan hasil yang diinginkan:
1) tidak menyalin kolom dataframe
> 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) membuat kolom baru sewenang-wenang di dataframe
> 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) membuat kolom baru dengan mengambil sampel kolom yang ada dan menempelkan beberapa karakter ekstra ke dalamnya
> 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) membuat kolom baru hanya dengan mengambil sampel kolom yang ada
> 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) menyalin kolom dengan cara 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
Meskipun bug ini tampaknya terjadi dalam kasus penggunaan (sangat) spesifik, ini mungkin penting bagi saya karena saya menggunakan setkey
dalam beberapa sistem produksi. Akan memeriksa apakah kasus khusus ini terjadi dalam kode produksi saya.
Mengkonfirmasikan @jaapwalhout pengamatan 's (dengan data.table_1.12.3).
Juga, (i) mengira itu mungkin terkait dengan faktor tetapi tidak (terjadi juga dengan karakter atau bilangan bulat), (ii) itu terjadi apa pun kuncinya (x atau y).
Di bawah ini, contoh sederhana yang dapat direproduksi.
Peringatan dalam tugas mungkin terkait tetapi saya tidak yakin untuk memahaminya.
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, saat menduplikasi elemen kolom atau daftar tanpa modifikasi, alamat memori akan sama dan pengaturan kunci akan "mengacaukan segalanya".
Bekerja dengan baik saat menggunakan 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")[]
Komentar yang paling membantu
iiuc, saat menduplikasi elemen kolom atau daftar tanpa modifikasi, alamat memori akan sama dan pengaturan kunci akan "mengacaukan segalanya".
Bekerja dengan baik saat menggunakan
copy()
.