使用R,使用dplyr:select获取“无法绑定数据,因为某些参数具有相同的名称”

问题描述 投票:1回答:3
#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")
r dplyr cbind
3个回答
5
投票

我有完全相同的问题,我想我正在查看与您相同的数据集。它是来自智能手机的运动传感器数据,不是吗?

问题正是错误信息所说的!该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%的人戴着手套和面具,并在你的数据中擦掉这样的废话。


1
投票

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


1
投票

我最近遇到了与不同数据集相同的问题。我在数据框(df)中识别重复列名称的整合方案是:

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

© www.soinside.com 2019 - 2024. All rights reserved.