Re: [問題] 關於重複測量資料

看板R_Language作者 (慎)時間9年前 (2015/03/03 18:33), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串3/3 (看更多)
※ 引述《yummy7922 (crucify)》之銘言: : [問題類型]: : 程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來) : [軟體熟悉度]: : 入門(寫過其他程式,只是對語法不熟悉) : [問題敘述]: : 我的資料是重複測量的資料,資料中有13820位病人的多次測量值, : 但不是每位病人的觀察筆數都相同, : 我想要針對每一位病人,將每三筆資料計算一個平均值, : 最後不到三筆的資料也算一個平均值, : 不過我不知道該如何做,想請教各位高手們,謝謝。 # dataset N=30000;n=20;obs=15 # N=病患數 n=隨機重複次數 obs=觀測項數 a=Sys.time() each_times=sample(n,N,replace=T) cum=cumsum(each_times) patient_name=rep(paste('patient',1:N,sep="-"),each_times) obs_times=rep(1,length(patient_name));obs_times[cum]=obs_times[cum]-each_times obs_times=cumsum(obs_times);obs_times[cum]=each_times total=sum(each_times) V=matrix(rnorm(total*obs),,obs) dataset=cbind(obs_times,V) row.names(dataset)=patient_name;colnames(dataset)=c('obs_times',paste('V',1:obs,sep="")) Sys.time()-a # N=30000;n=20;obs=15 => Time difference of 0.555032 secs # N=13820;n=15;obs=1 => Time difference of 0.03400207 secs # result k=3 b=Sys.time() times_a=dataset[,'obs_times'] data_m=matrix(dataset[,-1],,obs) c_data_m=apply(data_m,2,cumsum) filter_times=times_a%in%seq(k,max(times_a)%/%k*k,by=k) filter_times[c((times_a==1)[-1],FALSE)]=TRUE f_data_m=c_data_m[filter_times,] times_end=times_a[filter_times] times_length=times_end%%k;times_length[times_length==0]=k times_start=times_end-times_length+1 times_info=paste(times_start,times_end,sep='-') names_info=row.names(dataset)[filter_times] if(obs!=1){ result_mean=apply(f_data_m,2,function(x){c(x[1],diff(x))/times_length}) }else{ result_mean=c(f_data_m[1],diff(f_data_m))/times_length } result=data.frame(names_info,times_info,matrix(result_mean,,obs)) Sys.time()-b # N=30000;n=20;obs=15 => Time difference of 1.088062 secs # N=13820;n=15;obs=1 => Time difference of 0.2040122 secs # validation patient=paste('patient',sample(N,1),sep='-') dataset[row.names(dataset)==patient,] result[names_info==patient,] -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.220.44.209 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1425378818.A.848.html

03/07 13:46, , 1F
真的 謝謝
03/07 13:46, 1F
文章代碼(AID): #1KzOu2X8 (R_Language)
文章代碼(AID): #1KzOu2X8 (R_Language)