无效的下标类型列表,不确定原因

时间:2015-01-20 03:44:32

标签: r dataframe subset

我开始学习R,我正在编写一个脚本,但是我得到了一个奇怪的错误。我有一个数据框,我想采取一个列的子集。我创建了一个名为meansAndStdevs的变量,它是一个逻辑向量。我想使用此逻辑向量对我的数据框中的列进行子集化。这是我的代码:

features <- read.table("./features.txt")$V2;
meanAndStdevRegEx <- "(-mean\\(\\))|(-std\\(\\))";
meansAndStdevs <- as.logical(sapply(features, function(f) { grep(meanAndStdevRegEx, f); }));

fileData <- read.table(filePath);
fileDataSubset <- fileData[, meansAndStdevs]

但是,我最终收到错误Error in .subset(x, j) : invalid subscript type 'list',我不知道为什么!我认为它可能与我的meansAndStdevs列表有关,而NAs代替FALSE。希望得到一些指导。

以下是功能列表中的前几个项目(它的类实际上是&#34;因素&#34;):

 features <- c("tBodyAcc-mean()-X", "tBodyAcc-mean()-Y", "tBodyAcc-mean()-Z", 

 "tBodyAcc-std()-X", "tBodyAcc-std()-Y", "tBodyAcc-std()-Z", "tBodyAcc-mad()-X",

  "tBodyAcc-mad()-Y", "tBodyAcc-mad()-Z", "tBodyAcc-max()-X", "tBodyAcc-max()-Y", 
  "tBodyAcc-max()-Z", "tBodyAcc-min()-X", "tBodyAcc-min()-Y")

以下是fileData中的数据:https://raw.githubusercontent.com/MDSilber/CourseProject/master/Dataset/test/X_test.txt

虽然它非常大,所以这里有更多信息:

dput(fileData[1:5, 1:3])

structure(list(V1 = c(0.25717778, 0.28602671, 0.27548482, 0.27029822, 
0.27483295), V2 = c(-0.02328523, -0.013163359, -0.02605042, -0.032613869, 
-0.027847788), V3 = c(-0.014653762, -0.11908252, -0.11815167, 
-0.11752018, -0.12952716)), .Names = c("V1", "V2", "V3"), row.names = c("1", 
"2", "3", "4", "5"), class = "data.frame")

这是一个包含561列的表格。我尝试提取与meansAndStdevs向量的TRUE值对应的列,并从中创建fileDataSubset中的新数据帧。

提前致谢!

2 个答案:

答案 0 :(得分:0)

我弄明白为什么它不起作用。我应该使用grepl而不是grep,因为grepl输出逻辑向量(这是我想要的)。谢谢你的帮助!

答案 1 :(得分:0)

当我运行fileDataSubset&lt; - fileData [,meansAndStdevs]时,我收到无效列错误。这是因为逻辑向量meansAndStdevs的列数多于fileData。您可以获取与您的数据相对应的meansAndStdevs的子集,然后在此基础上生成子文件dataData:

datacols <- meansAndStdevs[1:ncol(fileData)]
fileDataSubset <- fileData[, datacols]

我假设以下设置(显示为清晰,因为您的帖子使它们无序):

fileData <- structure(list(V1 = c(0.25717778, 0.28602671, 0.27548482, 0.27029822, 
0.27483295), V2 = c(-0.02328523, -0.013163359, -0.02605042, -0.032613869, 
-0.027847788), V3 = c(-0.014653762, -0.11908252, -0.11815167, 
-0.11752018, -0.12952716)), .Names = c("V1", "V2", "V3"), row.names = c("1", 
"2", "3", "4", "5"), class = "data.frame")

features <- c("tBodyAcc-mean()-X", "tBodyAcc-mean()-Y", "tBodyAcc-mean()-Z", 

 "tBodyAcc-std()-X", "tBodyAcc-std()-Y", "tBodyAcc-std()-Z", "tBodyAcc-mad()-X",

  "tBodyAcc-mad()-Y", "tBodyAcc-mad()-Z", "tBodyAcc-max()-X", "tBodyAcc-max()-Y", 
  "tBodyAcc-max()-Z", "tBodyAcc-min()-X", "tBodyAcc-min()-Y")

meanAndStdevRegEx <- "(-mean\\(\\))|(-std\\(\\))";
meansAndStdevs <- as.logical(sapply(features, function(f) { grep(meanAndStdevRegEx, f); }));

然后您可以看到meansAndStdevs和fileDataSubset的大小不同:

> length(meansAndStdevs)
[1] 14
> ncol(fileDataSubset)
[1] 3

这就是你需要将meansAndStdevs子集化为数组索引的原因。