首页 > 解决方案 > 如何在r中创建for循环

问题描述

我想通过norm1~norm31创建for循环。

norm1 = norm1 %>% group_by(ID_Pair) %>% summarize(Norm_avg_PCK=mean(ID_avg_PCK,na.rm=T)
, Norm_avg_BT=mean(ID_avg_BT, na.rm=T))

norm2 = norm2 %>% group_by(ID_Pair) %>% summarize(Norm_avg_PCK=mean(ID_avg_PCK,na.rm=T)
, Norm_avg_BT=mean(ID_avg_BT, na.rm=T))

我想像上面一样创建 norm1~norm31 。

我已经尝试过此代码,但不断收到错误消息。

for (i in 1:31){
nam=paste("norm",i,sep="")
assign(nam,nam %>% group_by(ID_Pair) %>% summarize(Norm_avg_PCK=mean(ID_avg_PCK,na.rm=T)
, Norm_avg_BT=mean(ID_avg_BT, na.rm=T)))}

[错误] UseMethod(“group_by_”)中的错误:没有适用于“group_by_”的方法应用于“Character”类的对象

标签: rfor-loop

解决方案


首先,让我们将所有规范放入一个列表中:

normlist<-lapply(paste0("norm",1:31),get)

现在,我们可以使用lapply为每个规范做你的事情:

thing<-function(x) {x %>% group_by(ID_Pair) %>%
  summarize(Norm_avg_PCK=mean(ID_avg_PCK,na.rm=T),
    Norm_avg_BT=mean(ID_avg_BT, na.rm=T))}

lapply(normlist,thing)

带有一些虚假数据的示例:

a1<-data.frame(id=rep(letters[1:5],3),nums=1:15)
a2<-data.frame(id=rep(letters[6:10],3),nums=16:30)
alist<-lapply(paste0("a",1:2),get)
thing<-function(x) {x %>% group_by(id) %>% summarize(means=mean(nums))}
lapply(alist,thing)
[[1]]
# A tibble: 5 x 2
  id    means
  <fct> <dbl>
1 a        6.
2 b        7.
3 c        8.
4 d        9.
5 e       10.

[[2]]
# A tibble: 5 x 2
  id    means
  <fct> <dbl>
1 f       21.
2 g       22.
3 h       23.
4 i       24.
5 j       25.

如果要保留名称,可以使用sapplywithsimplify=FALSE代替lapply


推荐阅读