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

Dop*_*ima 5 r cbind dplyr

#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
Run Code Online (Sandbox Code Playgroud)

-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")
Run Code Online (Sandbox Code Playgroud)

小智 13

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

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

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

select(samsungData)
Run Code Online (Sandbox Code Playgroud)

这给了我这个错误,这正是您自己的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]
Run Code Online (Sandbox Code Playgroud)

结果:

[1] "fBodyAcc-bandsEnergy()-1,8" "fBodyAcc-bandsEnergy()-1,8" "fBodyAcc-bandsEnergy()-1,8"
Run Code Online (Sandbox Code Playgroud)

那告诉我,相同的列名称出现在三个位置。这在dplyr中不能很好地发挥作用。

然后,我想查看所有列名的频率表,并找出重复项。

names_freq <- as.data.frame(table(names(samsungData)))
names_freq[names_freq$Freq > 1, ]
Run Code Online (Sandbox Code Playgroud)

一堆出现了三遍!这里仅仅是少数。

                                Var1 Freq
9        fBodyAcc-bandsEnergy()-1,16    3
10       fBodyAcc-bandsEnergy()-1,24    3
11        fBodyAcc-bandsEnergy()-1,8    3
Run Code Online (Sandbox Code Playgroud)

结论:

工具(dplyr)没有损坏,数据有缺陷。如果要使用dplyr从此数据集中进行选择,则必须找到那些重复的列名并对其进行处理。也许您更改了列名(dplyr mutate会为您轻松完成)。另一方面,也许它们应该是重复的,并且在那里,因为它们是时间序列或实验观测值的某些迭代。然后也许您需要做的就是将这些列合并为一个,然后提供另一个维(变量)以区分它们。

那就是数据分析的分析部分。您必须深入研究数据,才能找到正确的答案。要么,要么您要回答的问题甚至不需要包含那些重复的列,在这种情况下,您将其丢弃并安静地入睡。

欢迎来到数据科学!充其量只是数学和机器学习的10%。90%的人戴上手套和口罩,然后在数据中抹掉这些废话。


小智 7

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

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