使用 R,使用 dplyr:select 获得 "Can't bind data because some arguments have the same name"
Using R, getting a "Can't bind data because some arguments have the same name" using dplyr:select
#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 到 select 某些框架。但是,我得到一个错误 returning dataset_test:
"Error: Can't bind data because some arguments have the same name"
但是,测试不会 return 错误并正确过滤。为什么行为会有所不同?
我正在使用的数据可以下载online。数据来源与变量名一一对应,只是用“_”代替了“.”
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")
此错误通常是由具有[=13=]相同名称 的列的数据框引起的,这应该是首先要检查的事情。我试图用 dplyr select 辅助函数(start_with、包含等)检查我自己的数据框,但即使是那些也不起作用,所以你可能需要导出到 csv 来检查在 Excel 或其他一些程序中或使用基本函数来检查 duplicate column names.
我遇到了完全相同的问题,我想我正在查看与您相同的数据集。这是来自智能 phone 的运动传感器数据,不是吗?
问题正是错误消息所说的!那个该死的集有重复的列名。这是我探索它的方式。我无法使用您的 dput
命令,因此无法试用您的数据。我正在展示我的代码和结果。我建议您替换变量 dataset_test
,其中我有 samsungData
.
这是错误。如果您只是 select 数据集,但不指明列,则错误消息会标识重复项。
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 中效果不佳。
然后我想查看所有列名的频率 table 并找出重复项。
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 到 select,你将不得不找到那些重复的列名并对它们做一些事情。也许您更改了列名(dplyr 的 mutate
会毫不费力地为您完成)。另一方面,也许它们应该被复制并且它们在那里是因为它们是时间序列或实验观察的一些迭代。也许然后您需要做的是将这些列合并为一个并提供另一个维度(变量)来区分它们。
这就是数据分析的分析部分。您必须深入研究数据才能找到正确的答案。或者,或者您要回答的问题甚至不需要包括那些重复的列,在这种情况下,您可以将它们扔掉并安然入睡。
欢迎来到数据科学!充其量,它只是 10% 的酷数学和机器学习。 90% 的人正在戴上手套和口罩,并清除数据中的此类垃圾。
我最近 运行 在不同的数据集上遇到了同样的问题。我在数据框 (df) 中识别重复列名的 tidyverse 解决方案是:
tibble::enframe(names(df)) %>% count(value) %>% filter(n > 1)
使用 Base R 查找重复列名的另一种可能性是使用 duplicated:
colnames(df)[which(duplicated(colnames(df)))]
#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 到 select 某些框架。但是,我得到一个错误 returning dataset_test:
"Error: Can't bind data because some arguments have the same name"
但是,测试不会 return 错误并正确过滤。为什么行为会有所不同?
我正在使用的数据可以下载online。数据来源与变量名一一对应,只是用“_”代替了“.”
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")
此错误通常是由具有[=13=]相同名称 的列的数据框引起的,这应该是首先要检查的事情。我试图用 dplyr select 辅助函数(start_with、包含等)检查我自己的数据框,但即使是那些也不起作用,所以你可能需要导出到 csv 来检查在 Excel 或其他一些程序中或使用基本函数来检查 duplicate column names.
我遇到了完全相同的问题,我想我正在查看与您相同的数据集。这是来自智能 phone 的运动传感器数据,不是吗?
问题正是错误消息所说的!那个该死的集有重复的列名。这是我探索它的方式。我无法使用您的 dput
命令,因此无法试用您的数据。我正在展示我的代码和结果。我建议您替换变量 dataset_test
,其中我有 samsungData
.
这是错误。如果您只是 select 数据集,但不指明列,则错误消息会标识重复项。
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 中效果不佳。
然后我想查看所有列名的频率 table 并找出重复项。
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 到 select,你将不得不找到那些重复的列名并对它们做一些事情。也许您更改了列名(dplyr 的 mutate
会毫不费力地为您完成)。另一方面,也许它们应该被复制并且它们在那里是因为它们是时间序列或实验观察的一些迭代。也许然后您需要做的是将这些列合并为一个并提供另一个维度(变量)来区分它们。
这就是数据分析的分析部分。您必须深入研究数据才能找到正确的答案。或者,或者您要回答的问题甚至不需要包括那些重复的列,在这种情况下,您可以将它们扔掉并安然入睡。
欢迎来到数据科学!充其量,它只是 10% 的酷数学和机器学习。 90% 的人正在戴上手套和口罩,并清除数据中的此类垃圾。
我最近 运行 在不同的数据集上遇到了同样的问题。我在数据框 (df) 中识别重复列名的 tidyverse 解决方案是:
tibble::enframe(names(df)) %>% count(value) %>% filter(n > 1)
使用 Base R 查找重复列名的另一种可能性是使用 duplicated:
colnames(df)[which(duplicated(colnames(df)))]