R循环存储结果异常求助:仅保留最后一次迭代结果
问题分析与解决办法
嗨~刚接触R语言循环遇到这种问题太正常啦,完全不用不好意思😉
咱们先拆解你代码里的核心问题:你把x <- data.frame()放在了循环体内部,这意味着每次循环开始时,都会把x重置成一个空的数据框!
第一次循环(i=1):你把a=1的子集rbind到空x里,这时候x里确实存着a=1的数据;但到第二次循环(i=2),第一行又把x清空了,然后再把a=2的子集存进去,所以最后x自然只剩a=2的结果啦。
解决方法1:把初始化放到循环外面
只需要把x <- data.frame()移到for循环的前面,这样每次循环都是在已有x的基础上追加数据,而不是重置:
a <- sample(rep(1:5, 10), 10) b <- sample(rep(1:5, 10), 10) c <- data.frame(a, b) s <- c(1,2) x <- data.frame() # 初始化移到循环外 for (i in s){ x <- rbind(x, c[which(a==i),]) } x
更推荐的R风格写法:避免循环,用向量化操作
其实在R里,很多时候不需要用循环来做子集筛选,向量化操作既简洁又高效。比如可以直接用%in%来筛选:
# 基础R写法 x <- c[c$a %in% s, ] # 如果你用dplyr包的话,写法更直观 library(dplyr) x <- c %>% filter(a %in% s)
至于你说用print()能看到两次结果,是因为每次循环里的print都会输出当前循环生成的子集,而不是像赋值给x那样被后续的重置覆盖,所以能完整看到两次的结果~
内容的提问来源于stack exchange,提问作者dorayin
相关产品推荐
相关产品推荐

