Используя R, получим «Невозможно связать данные, потому что некоторые аргументы имеют одинаковое имя», используя dplyr: select - PullRequest
0 голосов
/ 28 февраля 2019
#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")

Ответы [ 3 ]

0 голосов
/ 05 июня 2019

У меня была точно такая же проблема, и я думаю, что смотрю на тот же набор данных, что и вы.Это данные датчика движения со смартфона, не так ли?

Проблема именно в том, что говорится в сообщении об ошибке!У этого набора черт есть повторяющиеся имена столбцов.Вот как я это исследовал.Я не мог использовать ваши dput команды, поэтому я не мог проверить ваши данные.Я показываю свой код и результаты.Я предлагаю вам заменить вашу переменную, dataset_test, где у меня есть samsungData.

Вот ошибка.Если вы просто выбираете набор данных, но не указываете столбцы, в сообщении об ошибке указываются дубликаты.

select(samsungData)

Это дало мне эту ошибку, и именно это ваша ошибка dplyr пыталась сообщить вам..

Ошибка: столбцы "fBodyAcc -bandEnergy () - 1,8", "fBodyAcc -bandEnergy () - 9,16", "fBodyAcc -bandEnergy () - 17,24", "fBodyAcc -bandEnergy() -25,32 "," fBodyAcc -bandEnergy () - 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% надевают перчатки и маску и вытирают подобную хрень в ваших данных.

0 голосов
/ 25 июня 2019

Недавно я столкнулся с той же проблемой с другим набором данных.Мое решение для определения двойных имен столбцов в кадре данных (df) было следующим:

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

0 голосов
/ 10 апреля 2019

Эта ошибка часто вызывается кадром данных, имеющим столбцы с одинаковыми именами , которые следует проверить первым.Я пытался проверить свой собственный фрейм данных с помощью вспомогательных функций dplyr select (start_with, содержит и т. Д.), Но даже они не будут работать, поэтому вам может потребоваться экспорт в csv для проверки в Excel или другой программе или использованиябазовые функции для проверки повторяющихся имен столбцов .

...