IT干货网

r之如何根据列制作 "For loop"

dflying 2025年01月19日 编程设计 50 0

在此之前我一直在使用“For 循环”。但变量通常是 k 表示行号。

例子:

for (k in 1:n) {  
    expression 
} 

我的问题是,变量是否可能是某一列? 示例:

for ("column no" in 1:n) {  
    expression 
} 

我经历了几次试验和错误,现在有点卡住了。这是我的数据:

date    mold    no 
22-May  1.35436 1 
23-May  0.88592 1 
24-May  0.81316 1 
25-May  0.80856 1 
26-May  0.84646 1 
27-May  0.81762 1 
28-May  0.79828 1 
03-Jan  1.09158 2 
04-Jan  0.86661 2 
05-Jan  0.81908 2 
06-Jan  0.7555  2 
07-Jan  0.66577 2 
08-Jan  0.66706 2 
09-Jan  0.67133 2 
05-Feb  20.4366 3 
06-Feb  5.77923 3 
06-Feb  3.12323 3 
05-Feb  2.25436 3 
06-Feb  1.74551 3 
06-Feb  1.52744 3 
05-Feb  1.45483 3 
28-Jul  1.55148 4 
29-Jul  1.18882 4 
30-Jul  1.10595 4 
31-Jul  1.14101 4 
01-Aug  1.1453  4 
02-Aug  1.10113 4 
03-Aug  1.09152 4 
30-Nov  8.3254  5 
01-Dec  4.03003 5 
02-Dec  2.18026 5 
03-Dec  1.40028 5 
04-Dec  1.02901 5 
05-Dec  0.85859 5 
06-Dec  0.7776  5 

我想作为 R 为 no 列中的每个组(1 到 5)总结 mold 列中的值。例如,对于 no=1,它将是

1.35436 + 0.88592 + 0.81316 + 0.80856 + 0.84646 + 0.81762 + 0.79828 = 6.32436

然后重复 no = 2、3、4 等

请您参考如下方法:

我们可以遍历唯一元素,比较 (==) 并获得与 bool 向量对应的“mold”元素的总和

un1 <- unique(df1$no) 
v1 <- numeric(length(un1)) 
 
for(i in seq_along(v1)) v1[i] <- sum(df1$mold[df1$no== un1[i]]) 
v1 
#[1]  6.32436  5.53693 36.32120  8.32521 18.60117 

rowsum相同

rowsum(df1$mold, df1$no)[,1] 
#        1        2        3        4        5  
#  6.32436  5.53693 36.32120  8.32521 18.60117  

数据

df1 <- structure(list(date = c("22-May", "23-May", "24-May", "25-May",  
"26-May", "27-May", "28-May", "03-Jan", "04-Jan", "05-Jan", "06-Jan",  
"07-Jan", "08-Jan", "09-Jan", "05-Feb", "06-Feb", "06-Feb", "05-Feb",  
"06-Feb", "06-Feb", "05-Feb", "28-Jul", "29-Jul", "30-Jul", "31-Jul",  
"01-Aug", "02-Aug", "03-Aug", "30-Nov", "01-Dec", "02-Dec", "03-Dec",  
"04-Dec", "05-Dec", "06-Dec"), mold = c(1.35436, 0.88592, 0.81316,  
0.80856, 0.84646, 0.81762, 0.79828, 1.09158, 0.86661, 0.81908,  
0.7555, 0.66577, 0.66706, 0.67133, 20.4366, 5.77923, 3.12323,  
2.25436, 1.74551, 1.52744, 1.45483, 1.55148, 1.18882, 1.10595,  
1.14101, 1.1453, 1.10113, 1.09152, 8.3254, 4.03003, 2.18026,  
1.40028, 1.02901, 0.85859, 0.7776), no = c(1L, 1L, 1L, 1L, 1L,  
1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L,  
4L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L)), 
class = "data.frame", row.names = c(NA,  
-35L)) 


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!