2015-05-16 23 views
6

Tôi đang tìm cách điều khiển nhiều cột trong một data.table trong R. Vì tôi phải giải quyết các cột động cũng như đầu vào thứ hai, tôi không thể tìm một câu trả lời.Thay đổi nhiều Cột trong data.table r

Ý tưởng là để chỉ số hai hay một loạt hơn vào một ngày nhất định bằng cách chia tất cả các giá trị bằng giá trị kể từ ngày ví dụ:

set.seed(132) 
# simulate some data 
dt <- data.table(date = seq(from = as.Date("2000-01-01"), by = "days", length.out = 10), 
       X1 = cumsum(rnorm(10)), 
       X2 = cumsum(rnorm(10))) 

# set a date for the index 
indexDate <- as.Date("2000-01-05") 

# get the column names to be able to select the columns dynamically 
cols <- colnames(dt) 
cols <- cols[substr(cols, 1, 1) == "X"] 

Phần 1: Dễ dàng data.frame/áp dụng cách tiếp cận

df <- as.data.frame(dt) 
# get the right rownumber for the indexDate 
rownum <- max((1:nrow(df))*(df$date==indexDate)) 

# use apply to iterate over all columns 
df[, cols] <- apply(df[, cols], 
        2, 
        function(x, i){x/x[i]}, i = rownum) 

Phần 2: (nhanh) cách tiếp cận data.table Cho đến nay phương pháp data.table của tôi trông như thế này:

for(nam in cols) { 
    div <- as.numeric(dt[rownum, nam, with = FALSE]) 
    dt[ , 
    nam := dt[,nam, with = FALSE]/div, 
    with=FALSE] 
} 

đặc biệt là tất cả các with = FALSE trông không giống như data.table.

Bạn có biết cách nào nhanh hơn/thanh lịch hơn để thực hiện thao tác này không?

Bất kỳ ý tưởng nào được đánh giá cao!

Trả lời

8

Một tùy chọn sẽ là sử dụng set vì điều này liên quan đến nhiều cột. Lợi thế của việc sử dụng set là nó sẽ tránh được chi phí của [.data.table và làm cho nó nhanh hơn.

library(data.table) 
for(j in cols){ 
    set(dt, i=NULL, j=j, value= dt[[j]]/dt[[j]][rownum]) 
} 

Hoặc một lựa chọn hơi chậm sẽ

dt[, (cols) :=lapply(.SD, function(x) x/x[rownum]), .SDcols=cols] 
Các vấn đề liên quan