R语言循环处理数据集时出现参数长度为零错误排查
问题分析与解决:R代码中
argument is of length zero错误原因 首先,咱们直接揪出问题的核心:你在if判断里的列名拼写错了!
你写的是powerlift$Divison[i],但正确的列名是Division(你自己排查时用的也是这个正确拼写)——少了一个字母i。这就导致R找不到Divison这个列,返回的是NULL;当你尝试取NULL[1]时,得到的是一个长度为0的对象,这正好触发了Error in if (...) : argument is of length zero的错误。
修正方案1:修正拼写后的循环写法
先把列名拼写改对,同时别忘了最后移除数据框里多余的空行(因为你预先创建了n行,实际符合条件的行数可能远小于n):
powerlift <- read.csv("openpowerlifting.csv", header = TRUE, fill = TRUE, stringsAsFactors = FALSE ) n <- length(powerlift$TotalKg) UPA_Open <- as.data.frame(matrix(c(rep(0,n*17)), ncol=17)) j <- 1 for(i in 1:n){ # 修正拼写:Divison → Division if(powerlift$Division[i] == "UPA Open"){ UPA_Open[j,] <- powerlift[i,] j <- j + 1 } } # 移除未填充的空行 UPA_Open <- UPA_Open[1:(j-1), ]
更高效的R风格写法(推荐)
其实在R里处理这种行筛选,完全不需要用循环——向量化操作或者dplyr包的语法会简洁得多,而且处理大数据集时速度快很多:
基础R向量索引写法
powerlift <- read.csv("openpowerlifting.csv", header = TRUE, fill = TRUE, stringsAsFactors = FALSE ) # 直接用逻辑条件筛选符合要求的行 UPA_Open <- powerlift[powerlift$Division == "UPA Open", ]
dplyr包筛选写法(更直观)
如果你习惯用tidyverse的语法,dplyr的filter()函数会让代码可读性更强:
library(dplyr) powerlift <- read.csv("openpowerlifting.csv", header = TRUE, fill = TRUE, stringsAsFactors = FALSE ) UPA_Open <- powerlift %>% filter(Division == "UPA Open")
内容的提问来源于stack exchange,提问作者HereBeeBees
相关产品推荐
相关产品推荐

