Tôi đang cố gắng tính toán một số thay đổi phần trăm một cách chính xác bằng cách sử dụng data.table, nhưng tôi đã có một số khó hiểu hoàn toàn như thế nào các hoạt động .SD hoạt động.data.table hoạt động với .SD: tính toán tỷ lệ phần trăm thay đổi chính xác
Hãy nói rằng tôi có bảng sau
dt = structure(list(type = c("A", "A", "A", "B", "B", "B"), Year = c(2000L,
2005L, 2010L, 2000L, 2005L, 2010L), alpha = c(0.0364325563237498,
0.0401968159729988, 0.0357395587861466, 0.0317236054181487, 0.0328213742235379,
0.0294694430578336), beta = c(0.0364325563237498, 0.0401968159729988,
0.0357395587861466, 0.0317236054181487, 0.0328213742235379, 0.0294694430578336
)), .Names = c("type", "Year", "alpha", "beta"), row.names = c(NA,
-6L), class = c("data.table", "data.frame"))
> dt
## type Year alpha beta
## 1: A 2000 0.03643256 0.03643256
## 2: A 2005 0.04019682 0.04019682
## 3: A 2010 0.03573956 0.03573956
## 4: B 2000 0.03172361 0.03172361
## 5: B 2005 0.03282137 0.03282137
## 6: B 2010 0.02946944 0.02946944
Để tính phần trăm thay đổi về alpha, theo thể loại, tôi đã đưa ra đoạn mã sau:
dt[,change:=list(lapply(3:2,function(x)(.SD[x,alpha]/.SD[
(x-1),alpha]))),by=list(type)][][Year==2000,change:=NA]
Nhưng điều gì đó nói với tôi có thể họ là một cách súc tích hơn để làm điều đó. Đặc biệt nếu ai muốn thực hiện phần trăm thay đổi cho cả hai cột sau đây sẽ không hoạt động
dt[,c("changeAlpha","changeBeta"):=list(lapply(3:2,
function(x)(.SD[x]/.SD[(x-1)]))),by=list(type)][Year==2000,change:=NA][]
Vì vậy, tôi viện đến:
dt[,c("changeAlpha","changeBeta"):=list(
lapply(3:2,function(x)(.SD[x,alpha]/.SD[(x-1),alpha])),
lapply(3:2,function(x)(.SD[x,beta]/.SD[(x-1),beta]))),by=list(type)][
Year==2000,c("changeAlpha","changeBeta"):=list(NA,NA)][]
## type Year alpha beta changeAlpha changeBeta
## 1: A 2000 0.03643256 0.03643256 NA NA
## 2: A 2005 0.04019682 0.04019682 1.10332131557826 1.10332131557826
## 3: A 2010 0.03573956 0.03573956 0.889114172877617 0.889114172877617
## 4: B 2000 0.03172361 0.03172361 NA NA
## 5: B 2005 0.03282137 0.03282137 1.03460416276522 1.03460416276522
## 6: B 2010 0.02946944 0.02946944 0.897873527693412 0.897873527693412
Nhưng các hoạt động dường như đúng, nhưng có rất nhiều cảnh báo mà dẫn tôi đến đây.
- Phương pháp suy nghĩ của tôi có hoàn toàn sai hoặc là cách thích hợp để tiếp tục cho hoạt động này?
Tôi không có phiên bản cạnh chảy máu. Mã này chắc chắn ngắn gọn và dễ đọc hơn. Tuy nhiên, Sau khi cài đặt phiên bản mới nhất của data.table và chạy mã của bạn. Tôi đã có 'đối tượng 'CisOrderedSubset' không tìm thấy'. Bạn có bất kỳ dẫn đầu bởi bất kỳ cơ hội? – DJJ
Đóng * tất cả * bạn phiên R và chỉ mở một phiên rồi cài đặt lại. –
Đóng và cài đặt lại đã thực hiện công việc. cảm ơn – DJJ