R 3.0.3:x [j]中的错误:只有0可以与负下标混合

时间:2014-05-22 19:50:38

标签: r

首先,一些背景知识:我已经能够创建一系列文本文件的初始数据框。这些文件描述了一项实验,其中30名受试者通过三星Galaxy智能手机以各种方式测量了6个身体动作。七个.txt文件是:

  

xtest - 30%实验对象的观察指标;    testsubject - 此30%的主题ID号;    ytest - 这30%的独特行动;    xtrain - 其他70%实验对象的观察指标;    trainingubject - 其他70%的主题ID号;    ytrain - 其他70%的独特行动;   活动 - 源自三星手机的561摘要统计信息的向量   测量

从这7个.txt文件中,我创建了一个包含10299行和563列的新数据框。由于下面的代码描述了这个过程,我需要为测试和训练组编制y,subject和x文件。然后我进行测试并训练组并从活动字符向量中提供列名。接下来,我使用grep()函数对此数据框进行子集,以仅包含计算观察值和标准差的列(这些列的名称中包含“mean”和“std”)。此时,我有一个10299行和79列的数据框。然后,我将y和subject值列重新绑定回此子集化数据框(因为它们是通过我使用grep函数过滤掉的),它返回一个10299行和81列的数据帧。

 ## Read in data files and store in list
setwd("~/Desktop/UCI HAR Dataset/test_train")
test_files <- list.files("~/Desktop/UCI HAR Dataset/test_train")
data_list <- lapply(test_files, read.table, sep = "")

## Extract data files from list and save as data frames or vectors
features_df <- data.frame(data_list[1])
features <- as.character(features_df[,2])
xtest_data <- data.frame(data_list[4])
subject_test_data <- unlist(data_list[2])
ytest_data <- unlist(data_list[6])
subject_train_data <- unlist(data_list[3])
xtrain_data <- data.frame(data_list[5])
ytrain_data <- unlist(data_list[7])

## Create new data frame 
test_data <- cbind(ytest_data, subject_test_data, xtest_data)
train_data <- cbind(ytrain_data, subject_train_data, xtrain_data)
samsung_data <- rbind(test_data, train_data)
names(samsung_data) <- c("activity", "subject", features)

## Create subset of samsung_data data frame
std_data <- samsung_data[,grep("std",colnames(samsung_data))]
mean_data <- samsung_data[,grep("mean",colnames(samsung_data))]
ysubject_data <- data.frame(rbind(cbind(ytest_data, subject_test_data), 
                       cbind(ytrain_data, subject_train_data)))
mean_std_data <- cbind(ysubject_data, mean_data, std_data)

## Subset new data frame
mean_std_data[mean_std_data$subject == 1, mean_std_data$"tBodyGyroJerk-mean()-Y163"]

此最后一步产生以下错误:

Error in x[j] : only 0's may be mixed with negative subscripts

从做一些搜索stackoverflow和google,我认为这告诉我的是行现在都有负指针和正指数,因此不能进行子集化。

我想知道是否有人知道如何解决这个问题。我曾想过尝试重新编号数据框的索引作为一种可能的解决方案,但我不确定我能做到这一点。我有一种感觉,问题更为根本,必须与我对原始数据框进行子集化然后重新附加“主题”和“活动”列的方式有关。任何提示/建议将不胜感激。

1 个答案:

答案 0 :(得分:1)

mean_std_data$"tBodyGyroJerk-mean()-Y163"的价值是多少? R将其解释为列名列表(如果是字符)或列索引(如果是数字)。如果这是您要提取的列的名称,那么

mean_std_data[mean_std_data$subject == 1, "tBodyGyroJerk-mean()-Y163"]

就足够了。虽然我很惊讶,你使用read.table给出了真正的列名。我原以为

make.names("tBodyGyroJerk-mean()-Y163")
# [1] "tBodyGyroJerk.mean...Y163"