Tôi có một loạt dữ liệu trong một danh sách. Tôi muốn áp dụng unique()
cho mỗi data.table trong danh sách của tôi, nhưng làm như vậy phá hủy tất cả các khóa data.table của tôi.Tại sao lapply() không giữ lại các khóa data.table của tôi?
Dưới đây là một ví dụ:
A <- data.table(a = rep(c("a","b"), each = 3), b = runif(6), key = "a")
B <- data.table(x = runif(6), b = runif(6), key = "x")
blah <- unique(A)
Ở đây, blah
vẫn có một chìa khóa, và mọi thứ đều đúng trên thế giới:
key(blah)
# [1] "a"
Nhưng nếu tôi thêm các data.tables vào một danh sách và sử dụng lapply()
, các phím bị hủy:
dt.list <- list(A, B)
unique.list <- lapply(dt.list, unique) # Keys destroyed here
lapply(unique.list, key)
# [[1]]
# NULL
# [[2]]
# NULL
Điều này có thể phải làm với tôi không thực sự hiểu những gì nó có nghĩa là cho các phím được chỉ định "bằng cách tham khảo," như tôi đã có vấn đề khác với các phím biến mất.
Vì vậy:
- Tại sao lapply không giữ chìa khóa của tôi?
- Điều gì có nghĩa là các phím được chỉ định "theo tham chiếu"?
- Tôi có nên lưu trữ dữ liệu trong một danh sách không?
- Làm cách nào để lưu trữ/thao tác dữ liệu một cách an toàn. Có thể không sợ mất khóa?
EDIT:
Đối với những gì nó có giá trị, sợ hãi for
vòng lặp làm việc tốt, quá:
unique.list <- list()
for (i in 1:length(dt.list)) {
unique.list[[i]] <- unique(dt.list[[i]])
}
lapply(unique.list, key)
# [[1]]
# [1] "a"
# [[2]]
# [1] "x"
Nhưng điều này là R, và for
vòng là ác.
thú vị, 'unique.list [[1]]! = Unique (A)'. Đoán của tôi, mặc dù chỉ đơn giản là một đoán, là có lẽ những gì đang nhận được gọi là trong tuyên bố lapply là '{base}' duy nhất và không phải là '{data.table}' 'unique'. –
Tôi nghĩ bạn nói đúng. Tôi chỉ nhận thấy rằng - cùng với các phím bị phá hủy - 'unique' thậm chí không thực hiện công việc của mình khi chuyển qua 'lapply' –
@PaulMurray +1 Câu hỏi hay, nhưng _destroy_ có vẻ hơi mạnh. Nó không _retain_ chúng trong trường hợp này. –