如何在r

时间:2018-11-05 02:56:56

标签: r for-loop

我想为norm1〜norm31创建循环。

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_”的适用方法应用于“字符”类的对象

2 个答案:

答案 0 :(得分:0)

可能有更好的方法来组织数据。但是如果您愿意,可以使用get()来解决您的问题。

for (i in 1:31){
    nam=get(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)))
}

答案 1 :(得分:0)

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

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.

如果要保留名称,可以将sapplysimplify=FALSE一起使用,而不要使用lapply