2015-03-14 30 views
8

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?

Trả lời

8

Bạn có thể sử dụng chức năng shift từ v1.9.6 data.table +

Xác định chức năng của bạn

myFunc <- function(x) x/shift(x) 

Chọn cột mà bạn muốn để tính toán tỷ lệ phần trăm cho

cols <- c("alpha", "beta") 

Hoặc nếu bạn muốn chạy điều này trên tất cả các đại trừ ngoại trừ là người đầu tiên hai

cols <- names(dt)[-(1:2)] 

Chạy hàm trên các cột

dt[, paste0("change", cols) := lapply(.SD, myFunc), by = type, .SDcols = cols][] 
# type Year  alpha  beta changealpha changebeta 
# 1: A 2000 0.03643256 0.03643256   NA   NA 
# 2: A 2005 0.04019682 0.04019682 1.1033213 1.1033213 
# 3: A 2010 0.03573956 0.03573956 0.8891142 0.8891142 
# 4: B 2000 0.03172361 0.03172361   NA   NA 
# 5: B 2005 0.03282137 0.03282137 1.0346042 1.0346042 
# 6: B 2010 0.02946944 0.02946944 0.8978735 0.8978735 
+0

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

+1

Đóng * tất cả * bạn phiên R và chỉ mở một phiên rồi cài đặt lại. –

+1

Đóng và cài đặt lại đã thực hiện công việc. cảm ơn – DJJ

Các vấn đề liên quan