1

我有一个文件列表,其中进入 for 循环的文件具有不同数量的列。我想生成每个输入文件的子集,其中时间变量(列)>800,并且输入文件的编号也是输出列表的一部分。

由于不同的列号(6、7、8 或 9),我能够使用下面的代码版本(if 语句)一次输出一个文件的列表。但是当我尝试循环它并更改我得到的文件名时:

Error in subset[[i]] : object of type 'closure' is not subsettable

for (i in 1:n)
    {currentfile<- filelist[i]
    a=read.csv(currentfile, header=F)
    b=a[3:1000]
    mat-as.matrix(b)
    mat2.df<-as.data.frame(mat2)
    if (ncol(mat2.df) == 6) subset6[[i]]<-subset[[i]](mat2.df, time>800)
    if (ncol(mat2.df) == 7) subset7[[i]]<-subset[[i]](mat2.df, time>800)
    if (ncol(mat2.df) == 8) subset8[[i]]<-subset[[i]](mat2.df, time>800)
    if (ncol(mat2.df) == 9) subset9[[i]]<-subset[[i]](mat2.df, time>800)'
}

提前感谢您的任何建议!

4

2 回答 2

0

错误消息是说您正在尝试将索引(“子集”)应用于函数(“闭包类型的对象”)。

考虑到您尝试子集化的函数被调用,错误消息有点令人困惑subset

违规部分是以下部分: subset[[i]](mat2.df. . .

将它们[[i]]移到括号的末尾,你应该没问题。

   subset(mat2.df, time>800)[[i]]

与该问题不同,您可能需要重新访问您的for循环。
例如,这些线路背后的动机是什么?他们是否实现了预期目的?

     mat - as.matrix(b)
     mat2.df <- as.data.frame(mat2)
于 2013-05-02T03:26:52.083 回答
0

有什么理由需要 4 个单独的文件列表吗?该循环还将值分配给列表对象subset6、subset7、subset8 和subset9。您必须先创建它们,也许使用以下命令:

subset6 = list()

就个人而言,我认为没有任何必要。为什么不将列表初始化为

subsets = list()

然后,在你的循环中,你可以写

subsets[[i]] = subset(mat2.df, time>800)

如果您想要单独的列表,您会遇到另一个问题,即您需要单独的计数器来索引每个列表。因此,您将需要一个i6, i7, i8, 和i9用于您的每个单独的列表。

在较小的说明中,我无法确定您的代码前面部分中的拼写错误。如果处理输入预格式化的早期语句可能有错误,则很难对归因于后面一组条件语句的错误消息进行故障排除。

b= a[3:1000] 
mat-as.matrix(b)

这些可能应该是:

b <- a[3:1000, ]
mat2 <- as.matrix(b)

并且read.csv有一个skip你可以使用的选项。

于 2013-05-02T06:32:08.470 回答