我开始学习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中的新数据帧。
提前致谢!
答案 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子集化为数组索引的原因。