2017-10-04 81 views
1

下面是我的代码示例,其中每个时间步都依赖于前一个。如何简化for循环函数的输出

my_func <- function(n=100, con=0.95, t=35, m=0.047){ 
    G1<- numeric(length = t + 1) 
    G2<- numeric(length = t + 1) 
    G3<- numeric(length = t + 1) 
    G4<- numeric(length = t + 1) 
    G5<- numeric(length = t + 1) 
    G6<- numeric(length = t + 1) 
    G7<- numeric(length = t + 1) 
    G8<- numeric(length = t + 1) 
    G9<- numeric(length = t + 1) 
    MC1<- numeric(length = t + 1) 
    MC2<- numeric(length = t + 1) 
    MC3<- numeric(length = t + 1) 
    MC4<- numeric(length = t + 1) 
    MC5<- numeric(length = t + 1) 
    MC6<- numeric(length = t + 1) 
    DC <- numeric(length = t + 1) 
    NP <- numeric(length = t + 1) 

    G1[1]<- rbinom(1,n,con) 
    G2[1]<- 0 
    G3[1]<- 0 
    G4[1]<- 0 
    G5[1]<- 0 
    G6[1]<- 0 
    G7[1]<- 0 
    G8[1]<- 0 
    G9[1]<- 0 
    MC1[1]<- 0 
    MC2[1]<- 0 
    MC3[1]<- 0 
    MC4[1]<- 0 
    MC5[1]<- 0 
    MC6[1]<- 0 
    DC[1] <- 0 
    NP[1] <- 100 - G1[1] 

    for(step in 1:t){ 
    G2[step+1] <- rbinom(1, G1[step], (1-m)) 
    G3[step+1] <- rbinom(1, G2[step], (1-m)) 
    G4[step+1] <- rbinom(1, G3[step], (1-m)) 
    G5[step+1] <- rbinom(1, G4[step], (1-m)) 
    G6[step+1] <- rbinom(1, G5[step], (1-m)) 
    G7[step+1] <- rbinom(1, G6[step], (1-m)) 
    G8[step+1] <- rbinom(1, G7[step], (1-m)) 
    G9[step+1] <- rbinom(1, G8[step], (1-m)) 
    MC1[step+1] <- rbinom(1, G9[step], (1-m)) 
    MC2[step+1] <- rbinom(1, MC1[step], (1-m)) 
    MC3[step+1] <- rbinom(1, MC2[step], (1-m)) 
    MC4[step+1] <- rbinom(1, MC3[step], (1-m)) 
    MC5[step+1] <- rbinom(1, MC4[step], (1-m)) 
    MC6[step+1] <- rbinom(1, MC5[step], (1-m)) 
    G1[step+1] <- rbinom(1, MC6[step],con) 
    NP[step+1] <- MC6[step]-G1[step+1] 
    DC[step+1] <- sum(G1[step]-G2[step+1],G2[step]-G3[step+1],G3[step]- 
    G4[step+1],G4[step]-G5[step+1],G5[step]-G6[step+1],G6[step]- 
    G7[step+1],G7[step]-G8[step+1],G9[step]-MC1[step+1],MC1[step]-MC2[step+1],MC2[step]-MC3[step+1],MC3[step]-MC4[step+1],MC4[step]-MC5[step+1],MC5[step]-MC6[step+1]) 

    } 

    out <- cbind(G1, G2, G3, G4, G5, G6, G7, G8, G9, NP, MC1, MC2, MC3, MC4, 
MC5, MC6, DC) 
    return(out) 
} 
my_func() 

这将返回以下输出:

 G1 G2 G3 G4 G5 G6 G7 G8 G9 NP MC1 MC2 MC3 MC4 MC5 MC6 DC 
[1,] 99 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 
[2,] 0 90 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 
[3,] 0 0 87 0 0 0 0 0 0 0 0 0 0 0 0 0 3 
[4,] 0 0 0 79 0 0 0 0 0 0 0 0 0 0 0 0 8 
[5,] 0 0 0 0 77 0 0 0 0 0 0 0 0 0 0 0 2 
[6,] 0 0 0 0 0 73 0 0 0 0 0 0 0 0 0 0 4 
[7,] 0 0 0 0 0 0 68 0 0 0 0 0 0 0 0 0 5 
[8,] 0 0 0 0 0 0 0 63 0 0 0 0 0 0 0 0 5 
[9,] 0 0 0 0 0 0 0 0 61 0 0 0 0 0 0 0 0 
[10,] 0 0 0 0 0 0 0 0 0 0 53 0 0 0 0 0 8 
[11,] 0 0 0 0 0 0 0 0 0 0 0 50 0 0 0 0 3 
[12,] 0 0 0 0 0 0 0 0 0 0 0 0 47 0 0 0 3 
[13,] 0 0 0 0 0 0 0 0 0 0 0 0 0 45 0 0 2 
[14,] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 44 0 1 
[15,] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 42 2 
[16,] 41 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 
[17,] 0 40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 

有一种方法,以该系列代码,以便下G1列生成的元素 - G9将可以在单个列G和观察相应的元素在行[1,] - [9,]?这涉及当前代码中其他变量的MC1 - MC6等等。

在此先感谢。

UPDATE。

所需的输出,我要找的是以下内容:

    G   NP   MC   DC 
[1,]   99   1   0   0   
[2,]   90   0   0   9   
[3,]   87   0   0   3   
[4,]   79   0   0   8   
[5,]   77   0   0   2   
[6,]   73   0   0   4   
[7,]   68   0   0   5   
[8,]   63   0   0   5   
[9,]   61   0   0   2   
[10,]   0   0   53   8   
[11,]   0   0   50   3   
[12,]   0   0   47   3   
[13,]   0   0   45   2   
[14,]   0   0   44   1   
[15,]   0   0   42   2   
[16,]   41   1   0   0   
[17,]   40   0   0   1   
+0

你可以使用'诊断可能想些办法()'你的循环步骤中提取每次迭代的非零值,将其存储在一个矢量,然后结合在一起。 – LAP

+0

不清楚,也许尝试'x < - y < - z < - 1'来简化代码的某些部分?另外,阅读*矢量化* – zx8754

+0

你可以发布样本输出?你的问题不是很清楚 - 看起来你想要将数据重新整形为长整型,所以你最后有G,MC,DC和NP列,对吗? – shreyasgm

回答

1

我们使用rownames_to_column所以我们可以重建原始的订单时,我们就完成了。

我们使用gather从宽到长的格式。在这种格式中,我们可以从列名称中删除数字,并按新列名称(key)对数值进行总结。

然后我们只需要将其恢复为原始格式。

df %>% 
    rownames_to_column %>% 
    gather(key = 'key', value = 'value', -rowname) %>% 
    mutate(key = stringr::str_extract(key, '[a-zA-Z]+')) %>% 
    group_by(rowname, key) %>% 
    summarise(value = sum(value)) %>% 
    ungroup %>% 
    spread(key = 'key', value = 'value') %>% 
    arrange(as.integer(rowname)) %>% 
    select(G, NP, MC, DC) 
# # A tibble: 17 x 4 
#  G NP MC DC 
# <int> <int> <int> <int> 
# 1 99  1  0  0 
# 2 90  0  0  9 
# 3 87  0  0  3 
# 4 79  0  0  8 
# 5 77  0  0  2 
# 6 73  0  0  4 
# 7 68  0  0  5 
# 8 63  0  0  5 
# 9 61  0  0  0 
# 10  0  0 53  8 
# 11  0  0 50  3 
# 12  0  0 47  3 
# 13  0  0 45  2 
# 14  0  0 44  1 
# 15  0  0 42  2 
# 16 41  1  0  0 
# 17 40  0  0  1 
+0

谢谢@Paul。请原谅我的天真问题,但'%>%'是什么意思?我只有三个星期的经验,使用R. –

+0

@Francis_SU,'%>%'操作符来自'maggritr'包(用作'tidyverse'包的一部分),查看'tidyverse'小插件以查看它是如何使用的。 – shreyasgm

+0

谢谢@shreyasgm –