看板 Statistics 關於我們 聯絡資訊
先宣傳一下,歡迎去R版(R_Language)討論 以下是解法: library(data.table) DT <- data.table(id = rep(1:3, c(3,2,4)), year = c(2000, 2005, 2003, 2001:2003, 2005, 2008, 2004)) DT[ , yrhat := year - min(year), by = .(id)] print(DT) # id year yrhat # 1: 1 2000 0 # 2: 1 2005 5 # 3: 1 2003 3 # 4: 2 2001 0 # 5: 2 2002 1 # 6: 3 2003 0 # 7: 3 2005 2 # 8: 3 2008 5 # 9: 3 2004 1 以你的資料量去看計算時間: DT <- data.table(id = sample(1:1.6e5, 5e6, TRUE), year = sample(2000:2015, 5e6, TRUE)) message("The length of unique id: ", length(unique(DT$id))) # The length of unique id: 160000 st <- proc.time() DT[ , yrhat := year - min(year), by = .(id)] proc.time() - st # user system elapsed # 0.32 0.02 0.34 ※ 引述《ppp1987 (ppp)》之銘言: : [軟體程式類別]:R : [程式問題]:資料處理 : [軟體熟悉度]: : 新手 : [問題敘述]: : 現在我的資料大概長這樣 : ID year : 1 2000 : 1 2005 : 1 2003 : 2 2001 : 2 2002 : 3 2003 : 3 2005 : 3 2008 : 3 2004 : 現在我想算與每個ID中最小年份的差(yrhat) : ID year yrhat : A 2000 0 : A 2005 5 : A 2003 3 : B 2001 0 : B 2002 1 : C 2003 0 : C 2005 2 : C 2008 5 : C 2004 1 : [程式範例]: : 我現在想到的是用for迴圈寫 : for(ID in 1:3){ : ee<-length(table(data$ID)[table(data$ID)==ID]) : for(i in 1:ee){ : k<-data[data$ID==names(table(data$ID)[table(data$ID)==ID][i]),] : k[,c("yrhat")]<-k[,c("year")]-min( k[,c("year")] : data[data$ID==names(table(data$ID)[table(data$ID)==ID][i]),c("yrhat")]<- : k[,c("yrhat")] : } : } : 這可以跑出我要的結果 : 但是我現在資料有超過50萬筆 ID有16萬個 所以會跑好幾天 : 想請問版上的高手有沒有知道比較快的方法 : 謝謝 -- R資料整理套件系列文: magrittr #1LhSWhpH (R_Language) https://goo.gl/OBto1x data.table #1LhW7Tvj (R_Language) https://goo.gl/QFtp17 dplyr(上.下) #1LhpJCfB,#1Lhw8b-s (R_Language) https://goo.gl/GcfNoP tidyr #1Liqls1R (R_Language) https://goo.gl/pcq5nq pipeR #1NXESRm5 (R_Language) https://goo.gl/cDIzTh -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.170.41.113 ※ 文章網址: https://www.ptt.cc/bbs/Statistics/M.1477294288.A.C84.html
ppp1987: 成功了!太感謝了!! 10/24 15:48
不客氣 ※ 編輯: celestialgod (118.170.41.113), 10/24/2016 15:51:18