如何解决R代码中的Error in 2:n : NA/NaN argument错误?
解决R代码中的
Error in 2:n : NA/NaN argument问题 我来帮你搞定这个报错!这个错误的核心原因很明确:你在尝试生成2:n这样的序列时,n的值是NA或者无效的,R没法基于空值生成连续序列。结合你贴的代码来看,问题根源出在数据获取环节,下面一步步拆解修复:
先找代码里的坑
1. 无效的股票代码拖后腿
你在pdfetch_YAHOO里写的tickers列表最后带了个...,这完全不是合法的股票代码啊!Yahoo Finance根本识别不了,直接导致数据获取失败,返回空数据或者NA,后续用到行数nrow(data)的时候自然就成了NA,触发2:n的报错。
2. 变量赋值逻辑混乱
你在函数参数里直接写tickers<- c(...),这相当于在传参的时候重新给tickers赋值,不仅容易搞混变量,还让你之前定义的完整tickers列表白写了。
一步步修复代码
第一步:清理并整合股票代码
先把无效的...删掉,把道指代码^DJI和你之前定义的个股代码合并成完整的合法列表:
# 保留你原来的个股代码(注意:DWDP已更名为DD,GE已从道指移除,我帮你修正了) tickers <- c("AXP","MMM","BA","CAT","CVX","CSCO","KO","DD","AAPL","XOM","GS","HD","IBM","INTC","HPI","AIV","MCD","MRK","MSFT","NKE","PFE","PG","TRV","JPM","UTX","VZ","V","WMT","DIS") # 加上道指代码,组成完整查询列表 full_tickers <- c("^DJI", tickers)
第二步:安全获取数据并做有效性检查
获取数据后先检查是否成功,避免后续操作踩坑:
# 用tryCatch捕获可能的获取错误,比如网络问题、代码无效 tryCatch({ data <- pdfetch_YAHOO(full_tickers) # 检查数据是否为空 if (nrow(data) == 0) { stop("没获取到任何数据,大概率是代码有问题") } # 现在再用2:n就安全了,先确认行数足够 if (nrow(data) >= 2) { # 举个例子:取第2行到最后一行的数据 subset_data <- data[2:nrow(data), ] cat("成功生成数据子集!行数:", nrow(subset_data), "\n") } else { cat("数据只有1行,没法生成2:n的序列哦\n") } }, error = function(e) { cat("出错啦:", e$message, "\n") cat("建议检查:股票代码是否合法、网络是否正常\n") })
第三步:替换备选方案(可选)
如果pdfetch_YAHOO经常抽风,可以换成quantmod包的getSymbols,稳定性更好:
library(quantmod) # 获取道指数据 getSymbols("^DJI") # 获取个股数据 getSymbols(tickers)
完整修复后的代码
library(pdfetch) library(tidyverse) library(xts) # 定义合法股票代码 tickers <- c("AXP","MMM","BA","CAT","CVX","CSCO","KO","DD","AAPL","XOM","GS","HD","IBM","INTC","HPI","AIV","MCD","MRK","MSFT","NKE","PFE","PG","TRV","JPM","UTX","VZ","V","WMT","DIS") full_tickers <- c("^DJI", tickers) # 安全获取并处理数据 tryCatch({ data <- pdfetch_YAHOO(full_tickers) if (nrow(data) == 0) { stop("数据获取失败,请检查股票代码") } if (nrow(data) >= 2) { subset_data <- data[2:nrow(data), ] print("数据子集生成成功") } else { print("数据行数不足,无法生成2:n序列") } }, error = function(e) { message("错误信息:", e$message) message("排查方向:股票代码有效性、网络连接、API可用性") })
内容的提问来源于stack exchange,提问作者thankgod
相关产品推荐
相关产品推荐

