添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
ID       t1        t2        t3
1  1 52.56441 10.074323 -18.81786
2  1 50.18791 10.058374 -18.30228
3  1 47.68246 10.476636 -21.96603
4  1 48.52158 10.005308 -20.05809
5  1 53.18525 11.335882 -16.52016
6  1 49.73335  9.845289 -17.75557

t1、t2、t3分别表示模型的参数,我们的目的是根据模型参数还原出原始数据,每一个ID对于36次重复测量,即生成83行,36列的一个数据集。以ID=1为例,将参数带入模型中,共进行36次计算,每次计算代入的t值不同,t=1:36;已知数据集共有83个受试个体,遍历83次。

raneff<-read.csv("F:/SAS9.4/SAS.data/newphyscial.csv")
y<-data.frame(matrix(numeric(0),ncol=36))
colnames(y)<-paste0("t",1:36)
f1<-vector()
for(i in 1:nrow(raneff)){
        for(t in 1:36){
                f1[t]=raneff[i,2]+raneff[i,3]*(t/12)+raneff[i,4]*(exp(-2.09*(t/12))-1)
        VR=matrix(f1,ncol=1)
        y[i,]=VR
y<-round(y,2)
head(y)

首先,创建一个空的数据框,36列,建立f1向量,i从1遍历数据集的所有行数,t从1:36,进行36次重复测量。循环为嵌套循环。f1[t]表示第i个个体的第t次循环,转换为矩阵形式,生成VR为36乘1的一个矩阵,y[i,]=VR表示将矩阵进行转置,即第i个个体的36次重复测量,矩阵维数1乘36。
VR如下:

[1,] 56.57178 [2,] 59.98135 [3,] 62.98855 [4,] 65.65770 [5,] 68.04284 [6,] 70.18936 [7,] 72.13540 [8,] 73.91301 [9,] 75.54912 [10,] 77.06633 ......

y[i,]如下:

t1    t2    t3    t4    t5    t6    t7    t8    t9
83 56.57 59.98 62.99 65.66 68.04 70.19 72.14 73.91 75.55
     t10   t11   t12   t13   t14   t15   t16   t17   t18
83 77.07 78.48 79.82 81.08 82.28 83.44 84.55 85.63 86.67
    t19  t20   t21   t22   t23   t24   t25   t26   t27
83 87.7 88.7 89.68 90.65 91.61 92.56 93.49 94.43 95.35
     t28   t29  t30 t31   t32    t33    t34    t35    t36
83 96.27 97.18 98.1  99 99.91 100.81 101.72 102.62 103.52

结果:head(y)

t1    t2    t3    t4    t5    t6    t7    t8    t9
1 56.41 59.78 62.74 65.36 67.70 69.80 71.70 73.43 75.01
2 53.95 57.25 60.15 62.72 65.02 67.08 68.95 70.65 72.22
3 52.07 55.89 59.24 62.20 64.82 67.16 69.27 71.18 72.92
4 52.56 56.09 59.19 61.92 64.35 66.53 68.49 70.27 71.90
5 56.77 59.93 62.74 65.25 67.51 69.56 71.44 73.16 74.76
6 53.39 56.60 59.42 61.92 64.16 66.17 67.99 69.64 71.17
   ......

重点在于首先建立一个空矩阵及空向量用于存放数据,
之后for循环得出结果。注意y[i,]和VR的转换,相当于进行转置,维数为36乘1的矩阵转换为1乘36的矩阵。
根据上述循环思维,将如下归一化处理利用循环方式得到。来源「jiyang_1」

#对输入矩阵进行归一化处理(0到1)
b1=(p[,1]-min(p[,1]))/(max(p[,1])-min(p[,1]))  
b2=(p[,2]-min(p[,2]))/(max(p[,2])-min(p[,2]))  
b3=(p[,3]-min(p[,3]))/(max(p[,3])-min(p[,3]))  
b4=(p[,4]-min(p[,4]))/(max(p[,4])-min(p[,4])) 
b5=(p[,5]-min(p[,5]))/(max(p[,5])-min(p[,5]))  
b6=(p[,6]-min(p[,6]))/(max(p[,6])-min(p[,6]))  
b7=(p[,7]-min(p[,7]))/(max(p[,7])-min(p[,7]))  
b8=(p[,8]-min(p[,8]))/(max(p[,8])-min(p[,8])) 
b9=(p[,9]-min(p[,9]))/(max(p[,9])-min(p[,9]))  
b10=(p[,10]-min(p[,10]))/(max(p[,10])-min(p[,10]))  
p0=cbind(b1,b2,b3,b4,b5,b6,b7,b8,b9,b10)#归一化后的数据放入矩阵中 

for循环代码:

y<-data.frame(matrix(numeric(0),nrow=11))
f1<-vector()
for(i in 1:10){
    f1=(p[,i]-min(p[,i]))/(max(p[,i])-min(p[,i]))
    VR=matrix(f1,ncol=1)
    y[,i]=VR
class(y)

与之前例子不同的是该循环不是嵌套循环形式,只涉及i,建立一个11行的空矩阵,f1输出为11乘1的矩阵,用VR表示。将VR中数据填入空矩阵中,这里需注意:未进行之前所述的转置。y[i,]同为11乘1的矩阵。
输出结果:

V1 V2 V3 V4 V5 1 0.00000000 0.00000000 0.00000000 0.0000000 0.0000000 2 0.05106965 0.07990388 0.07519758 0.0673893 0.1302504 3 0.11883606 0.17730150 0.16540037 0.1599639 0.2265402 4 0.19960896 0.26705204 0.25427761 0.2433822 0.3156171 5 0.30552268 0.30401298 0.28692703 0.3077170 0.3851269 6 0.44355912 0.41296346 0.41484978 0.4065333 0.4842289 7 0.51771847 0.53776316 0.53700843 0.5323744 0.5474059 8 0.60402497 0.60535358 0.58161768 0.6223840 0.5806367 9 0.72808887 0.73977011 0.73251601 0.7357412 0.7671696 10 0.85873195 0.86550453 0.86138710 0.8629827 0.8812187 11 1.00000000 1.00000000 1.00000000 1.0000000 1.0000000 V6 V7 V8 V9 V10 ......

如需修改列名,可用colnames命令

R语言for循环程序示例数据集:ID t1 t2 t31 1 52.56441 10.074323 -18.817862 1 50.18791 10.058374 -18.302283 1 47.68246 10.476636 -21.966034 1 48.52158 10.005308 -20.058095 1 53.18525 11.335882 -16.520166 1 49.73335 9.845289 -17.75557