使用R,使用dplyr:select获取“由于某些参数名称相同而无法绑定数据”

时间:2019-02-28 18:29:27

标签: r dplyr cbind

#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选择某些帧。

但是,返回数据集测试时出错

  

“错误:由于某些参数具有相同的名称,因此无法绑定数据”

但是,测试不会返回错误并正确过滤。

为什么行为不同?

我正在使用的数据可以在

处下载。

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")

4 个答案:

答案 0 :(得分:5)

我遇到了完全相同的问题,我想我正在寻找与您相同的数据集。是来自智能手机的运动传感器数据,不是吗?

问题恰恰是错误消息说的!该dang集具有重复的列名。这就是我的探索方式。我无法使用您的dput命令,因此无法尝试您的数据。我正在显示我的代码和结果。建议您将变量dataset_test替换为samsungData

这是错误。如果仅选择数据集而不指定列,则错误消息将标识重复项。

select(samsungData)

这给了我这个错误,这正是您自己的dplyr错误试图告诉您的。

错误:“ fBodyAcc-bandsEnergy()-1,8”,“ fBodyAcc-bandsEnergy()-9,16”,“ fBodyAcc-bandsEnergy()-17,24”,“ fBodyAcc-bandsEnergy()-25”列,32“,” fBodyAcc-bandsEnergy()-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, ]

其中一堆出现了3次!这里只是几个。

                                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%的人戴上手套和口罩,然后在数据中抹掉垃圾。

答案 1 :(得分:1)

我最近在使用不同的数据集时遇到了同样的问题。我在数据框(df)中标识重复列名的方法是:

tibble::enframe(names(df)) %>% count(value) %>% filter(n > 1)

答案 2 :(得分:0)

此错误通常是由数据框包含具有相同名称的列引起的,应该首先检查该错误。我试图使用dplyr select辅助函数(start_with,contains等)检查我自己的数据框,但是即使那些也不起作用,因此您可能需要导出到csv以检查Excel或其他程序或使用基本功能来检查duplicate column names

答案 3 :(得分:0)

使用Base R查找重复列名称的另一种可能性是使用重复:

colnames(df)[which(duplicated(colnames(df)))]