r - 如何在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”类的对象
解决方案
首先,让我们将所有规范放入一个列表中:
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.
如果要保留名称,可以使用sapply
withsimplify=FALSE
代替lapply
。
推荐阅读
- ssl - 无法验证在 https://api.paypal.com 上找到的证书
- javascript - 如何从网页中读取文本文件?
- python - 无法 pip 安装 mysqlclient 并执行“gcc”:权限被拒绝
- javascript - 比较数组中的多个对象并在某个公共值时求和,JavaScript / Vue.js
- spring - 如何返回带有错误响应的 Http 状态行?
- java - 试图理解Java中结合布尔和逻辑运算符的代码块
- python - Django:如何从基本模型类的实例中填充继承的表单字段?
- c++ - 如何创建多个视口,每个视口都有不同的场景?
- javascript - 如何在 Jest 测试中真正调用 fetch
- c# - 如何绑定列表
动态属性