首页 > 解决方案 > R错误:新列会在现有列之后留下孔;如何解决这个问题?

问题描述

我尝试运行我的代码,但总是收到以下错误消息:

Fehler in `[<-.data.frame`(`*tmp*`, , i, value = list(`NOVN SW Equity PX_LAST` = c(6.54, : new columns would leave holes after existing columns

我的代码如下所示

library(tidyverse)
Daten_bloomberg <- read_excel("~/Desktop/master thesis topics/Data for R/Daten_bloomberg.xlsx", na = "NA")
Event <- read_excel("~/Desktop/master thesis topics/Data for R/Event.xlsx", col_types = c("numeric", "text"))
Daten_bloomberg <- as.data.frame(sapply(Daten_bloomberg, as.numeric)) 
Daten_bloomberg[is.na(Daten_bloomberg)] <- NA

Data_last_price <- data.frame(Data1 = rep(1,7875) )

for (i in 1:133) {
  EventTicker <-  as.character(Event[i,2])
  EventTicker1 <- paste(as.character(Event[i,2]) , "PX_Last") 
  Data1 <- select(Daten_bloomberg , contains(EventTicker1))
  Data_last_price[,i] <- rep(Data1,1)
}

使用该代码,我基本上尝试使用包含股票代码和字符串 PX_Last 的列创建一个新的数据框。Daten_bloomberg 包含 7875 行和 884 个变量。事件包含 133 个观察值和两个变量。

但是,当我运行此循环时,总是会出现上述错误消息,并且循环在位置 87 处停止。我猜问题是 Dataset Daten_bloomberg 中的列包含很多 NA 值。但我不知道如何解决这个问题。有人有想法吗?

标签: r

解决方案


好吧,我们有一些事情要解决。

首先,欢迎使用 SO,您的代码不可重现,因为它缺少示例数据集。您也可以省略rep(data1, 1)rep(x, 1) == x.

接下来令人难以置信的是,您已经获得了您的特定错误,这意味着我必须深入研究源代码才能找到它,因为我在 6 年的 R 经验中从未见过它。而且可能不容易看出,但您的错误不是来自迭代 87,而是来自迭代 86。

让我们用一个可重现的例子来说明(首先注意名称)。

names(mtcars)
[1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear" "carb"
library(tidyverse)
mtcars2 <- mtcars
newcols <- c("I'm not column", "cyl") # <= one column exist, one does not
for(i in seq_along(newcols)){
  mtcars[, ncol(mtcars) + i] <- select(mtcars2, contains(newcols[i]))
}
print(i) 
[1] 2

哦,注意它是如何在 (i = 2) 上抛出错误的cyl,所以最明显的想法是“我的cyl专栏有问题”。但是让我们看一下 mtcars

names(mtcars)
[1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear" "carb"

"I'm not a column"哦.. (应该命名为)没有新列"V1",我试图将其放置到位置 12。接下来我们尝试放置cyl到位置 13,但没有第 12 列,因此[<-.data.frame尝试创建第 12 列,但是我们没有' 没有为此列提供任何值,它会引发错误,如下面的较小示例所示:

mtcars[, 13] <- mtcars2$cyl

简而言之,对于您的特定情况,运行下面的代码应该会导致打印最后一行(这是您的错误)

i <- 86
EventTicker <-  as.character(Event[i,2])
EventTicker1 <- paste(as.character(Event[i,2]) , "PX_Last") 
Data1 <- select(Daten_bloomberg , contains(EventTicker1))
nrow(Data1)
[1] 0

推荐阅读