R中矩阵的下标数不正确

时间:2014-08-18 10:17:19

标签: r

所以,我有一个数据框列表,名为"D1.txt", "D2.txt"................"D45.txt". Each of the file contains 2列,每个文件有1000行。

我基本上是尝试通过以下代码向列表中的每个数据框添加一个新列,但它将错误显示为   incorrect number of subscripts on matrix

我正在使用的代码是,

L <- lapply(seq_along(L), function(i) { 
    L[[i]][, paste0('DF', i)] <-  1
    L[[i]] 
})

其中L是包含数据框的列表的名称。

为什么会出现这个错误?谢谢! :)

编辑:一个可重复的例子:

# Create dummy data
L <- replicate(5, expand.grid(1:10, 1:10)[sample(100, 10), ], simplify=FALSE)

# Add a column to each data.frame in L. 
# This will indicate presence of the pair when we merge.
L <- lapply(seq_along(L), function(i) { 
  L[[i]][, paste0('DF', i)] <-  1
  L[[i]] 
})

2 个答案:

答案 0 :(得分:7)

我认为当您读入"D1.txt", "D2.txt"................"D45.txt"文件时,它们会转换为矩阵,这就是您的特定for循环失败的原因。我会用你的例子:

L <- replicate(5, expand.grid(1:10, 1:10)[sample(100, 10), ], simplify=FALSE)

如果我们使用class(L[[1]])挑选列表的第一个元素,如果您在此列表中使用仅包含[1] "data.frame"的for循环,则会输出data.frames您将看不到错误它会给你你想要的东西。但是,如果我们将列表中的所有元素转换为矩阵:

for(i in seq_along(L)){
     L[[i]] <- as.matrix(L[[i]])
}

并与class(L[[1]])核实,它会输出[1] "matrix"。如果您现在在L使用for循环,现在包含矩阵,我们将得到:

> L <- lapply(seq_along(L), function(i) { 
+   L[[i]][, paste0('DF', i)] <-  1
+     L[[i]] 
+     })
Error in `[<-`(`*tmp*`, , paste0("DF", i), value = 1) : 
  subscript out of bounds

因此,您可以确保在阅读文件时将其强制转换为data.frames,使用@Richards解决方案,或者读取文件并通过data.frames >

 for(i in seq_along(L)){
    L[[i]] <- as.data.frame(L[[i]])
}

并使用你的for循环。

答案 1 :(得分:2)

这是一个关于如何将列添加到列表中存储的数据帧的小例子。在[<-来电时使用lapply分配新列。在这里,我将包含值10和11的列"newCol"添加到lst

中的每个数据框
> lst <- list(a = data.frame(x = 1:2), b = data.frame(y =3:4))
> lapply(lst, `[<-`, ,'newCol', 10:11)
# $a
# x  newCol
# 1 1      10
# 2 2      11
# 
# $b
# y  newCol
# 1 3      10
# 2 4      11