作者celestialgod (天)
看板Statistics
標題Re: [程式] R整理資料的問題
時間Mon Oct 24 15:31:21 2016
先宣傳一下,歡迎去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://webptt.com/m.aspx?n=bbs/Statistics/M.1477294288.A.C84.html
1F:推 ppp1987: 成功了!太感謝了!! 10/24 15:48
不客氣
※ 編輯: celestialgod (118.170.41.113), 10/24/2016 15:51:18