0

我有一个名为“training_data”的列表。“training_data”列表包含使用以下函数从多个文件中读取的数据。

training_data <- lapply(files, read.table, header=TRUE, sep=",")

我可以使用以下命令访问任何数据集的第一个字段:

training_data[[1]][1]           # The first field contains the class "pos OR neg"

我必须使用支持向量机 (e1071) 使用这些数据集(包含在 training_data 中)进行二进制分类。但问题是某些数据集仅包含一个类的数据,即全部 pos 或全部 neg,这对于 svm 函数是不可接受的,我想排除这些数据集。我尝试了以下代码,但无法访问类列。

training_data<-lapply(training_data, 
                function(data)
                 {
                    if(["the class field is always positive"])
                       ### exclude this dataset from training_data

                 })

更新:我如何才能访问传递给函数的第一列数据?以及如何从 training_data 中排除那些仅在类列中包含一个类的数据集?

谢谢

4

2 回答 2

2

这就是该Filter功能的用途。由于您没有提供复制代码,这里有一个关于如何使用Filter. 假设您有一个很大的向量列表,每个向量的长度为 2 个元素:

mylist <- lapply(1:1000, function(i) c(runif(1), runif(1)))

现在,如果您只想保留列表中第一个元素大于 0.5 的那些向量,您可以执行以下操作:

filtered_list <- Filter(function (x) x[1] > 0.5, mylist)

现在,如果 的每个元素mylist是 adata.frame并且每个元素中的第一列data.frame是模型的响应向量,就像您的数据一样,您可以使用data[,1]Justin 提到的符号过滤掉所有data.frames只有正数或负数的第一列中的值:

filtered_list <- Filter(function (x) { !(all(x[,1] < 0) || all(x[,1] > 0))}, 
                        mylist)
于 2013-01-28T23:28:47.993 回答
1

您将像以前一样访问第一个元素。该对象data现在在您的函数中可供您使用,并且将与您读入列表的每个数据集具有相同的结构。因此,data[1]或更明确地data[,1]将访问它们。

我建议您查看许多优秀的 R 指南(尤其是cran.r-project.org上列出的指南),以更好地了解该功能的工作原理以及如何分割数据。

如果我还没有回答您的问题,请随时询问另一个问题或编辑此问题以包含一些复制您发现的问题的示例数据。就目前而言,这个问题很可能已经结束。

于 2013-01-28T22:21:14.677 回答