r - 使用 R,获取 "Can' t 绑定(bind)数据,因为某些参数具有相同的名称”使用 dplyr :select

标签 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 是一个宽数据框

命名并绑定(bind)这些数据帧后,我尝试使用 dplyr::select 来选择某些帧。但是,我在返回 dataset_test 时遇到错误:

"Error: Can't bind data because some arguments have the same name"

但是,测试不会返回错误并正确过滤。为什么行为上会有差异?

我正在使用的数据可以下载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")

最佳答案

我遇到了完全相同的问题,并且我认为我正在查看与您相同的数据集。这是来自智能手机的运动传感器数据,不是吗?

问题正是错误消息所说的!该该死的集合有重复的列名。这是我的探索方式。我无法使用您的 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, ]

一群人出现了三次!这里只是一些。

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

关于r - 使用 R,获取 "Can' t 绑定(bind)数据,因为某些参数具有相同的名称”使用 dplyr :select,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54932063/

相关文章:

r - cbind 一个带有空数据框的数据框 - cbind.fill?

r - sp::over()用于多边形分析中的点

r - 如何引用 summarise_all、summarise_if 等中的特定变量?

r - 如何查找ANY列是否具有我要查找的特定值?

r - dplyr 使用多个参数的自定义函数分别在每一列进行变异

r - cbind 工作日匹配的两个数据帧

r - 在线性模型中结合 cbind 和 paste

r - 是否有 R 函数将 ICD10 代码的数据帧转换为各自的子章节

r - 类似于 R 在 Matlab 中的 rep 的功能

c - R 中是否有比 readLines 更快的东西 - 或者我如何找出读取连接速度如此慢的原因?