#use readtable to create data frames of following unzipped files below
x.train <- read.table("UCI HAR Dataset/train/X_train.txt")
subject.train <- read.table("UCI HAR Dataset/train/subject_train.txt")
y.train <- read.table("UCI HAR Dataset/train/y_train.txt")
x.test <- read.table("UCI HAR Dataset/test/X_test.txt")
subject.test <- read.table("UCI HAR Dataset/test/subject_test.txt")
y.test <- read.table("UCI HAR Dataset/test/y_test.txt")
features <- read.table("UCI HAR Dataset/features.txt")
activity.labels <- read.table("UCI HAR Dataset/activity_labels.txt")
colnames(x.test) <- features[,2]
dataset_test <- cbind(subject.test,y.test,x.test)
colnames(dataset_test)[1] <- "subject"
colnames(dataset_test)[2] <- "activity"
test <- select(features, V2)
dataset_test <- select(dataset_test,subject,activity)
[1] Error: Can't bind data because some arguments have the same name
-features是一个两列数据框,第二列包含x.test的名称
-subject.test是单列数据框
-y.test是单列数据框
-x.test是一个宽数据框架
在命名和绑定这些数据帧后,我尝试使用dplyr :: select来选择某些帧。
但是,我收到一个返回dataset_test的错误
“错误:无法绑定数据,因为某些参数具有相同的名称”
但是,测试不会返回错误并正确过滤。
为什么行为不同?
我正在使用的数据可以在下载
https://d396qusza40orc.cloudfront.net/getdata%2Fprojectfiles%2FUCI%20HAR%20Dataset.zip
数据源对应于变量名称,除了使用“_”而不是“。”。
dput
> dput(head(x.test[,1:5],2))
structure(list(V1 = c(0.25717778, 0.28602671), V2 = c(-0.02328523,
-0.013163359), V3 = c(-0.014653762, -0.11908252), V4 = c(-0.938404,
-0.97541469), V5 = c(-0.92009078, -0.9674579)), row.names = 1:2, class = "data.frame")
> dput(head(subject.test,2))
structure(list(V1 = c(2L, 2L)), row.names = 1:2, class = "data.frame")
> dput(head(y.test,2))
structure(list(V1 = c(5L, 5L)), row.names = 1:2, class = "data.frame")
> dput(head(features,2))
structure(list(V1 = 1:2, V2 = c("tBodyAcc-mean()-X", "tBodyAcc-mean()-Y"
)), row.names = 1:2, class = "data.frame")
我有完全相同的问题,我想我正在查看与您相同的数据集。它是来自智能手机的运动传感器数据,不是吗?
问题正是错误信息所说的!该dang集具有重复的列名。这是我探索它的方式。我无法使用你的dput
命令,所以我无法试用你的数据。我正在显示我的代码和结果。我建议你替换你的变量dataset_test
,我有samsungData
。
这是错误。如果您只选择数据集,但未指明列,则错误消息会标识重复项。
select(samsungData)
这给了我这个错误,这正是你自己的dplyr错误试图告诉你的。
错误:列“fBodyAcc-bands能量() - 1,8”,“fBodyAcc-bands能量() - 9,16”,“fBodyAcc-bands能量() - 17,24”,“fBodyAcc-bands能量() - 25,32” ,“fBodyAcc-bands能量() - 33,40”,......必须有一个独特的名字
然后我想看看第一列重复的位置。 (我不认为我会用正则表达式做得很好,但是这个让我很生气,我想找到它。)
has_dupe_col <- grep("fBodyAcc\\-bandsEnergy\\(\\)\\-1,8", names(samsungData))
names(samsungData)[has_dupe_col]
结果:
[1] "fBodyAcc-bandsEnergy()-1,8" "fBodyAcc-bandsEnergy()-1,8" "fBodyAcc-bandsEnergy()-1,8"
这表明我在三个位置出现了相同的列名。这在dplyr中不会很好用。
然后我想查看所有列名称的频率表并调出重复项。
names_freq <- as.data.frame(table(names(samsungData)))
names_freq[names_freq$Freq > 1, ]
他们中的一堆出现了三次!这里仅仅是少数。
Var1 Freq
9 fBodyAcc-bandsEnergy()-1,16 3
10 fBodyAcc-bandsEnergy()-1,24 3
11 fBodyAcc-bandsEnergy()-1,8 3
结论:
工具(dplyr)没有损坏,数据有缺陷。如果要使用dplyr从此数据集中进行选择,则必须找到这些重复的列名称并对其执行某些操作。也许你改变了列名(dplyr的mutate
会为你做没有悲伤的事)。另一方面,也许他们应该被复制并且他们在那里,因为他们是时间序列或实验观察的一些迭代。也许那么你需要做的是将这些列合并为一个并提供另一个维度(变量)来区分它们。
这是数据分析的分析部分。您将不得不深入研究数据,看看答案是正确的。无论是那个,或者你想要回答的问题都不需要包括那些重复的列,在这种情况下你扔掉它们并安静地睡觉。
欢迎来到数据科学!充其量只是10%的酷数学和机器学习。 90%的人戴着手套和面具,并在你的数据中擦掉这样的废话。
此错误通常是由具有相同名称的列的数据框引起的,应该首先检查。我试图用dplyr select helper函数(start_with,contains等)来检查我自己的数据框,但即使那些也行不通,所以你可能需要导出到csv来检查Excel或其他一些程序或使用用于检查duplicate column names的基本函数。
我最近遇到了与不同数据集相同的问题。我在数据框(df)中识别重复列名称的整合方案是:
tibble::enframe(names(df)) %>% count(value) %>% filter(n > 1)