所以,我有一个数据框列表,名为"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]]
})
答案 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解决方案,或者读取文件并通过
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