2016-08-03 2 views
8

Сегодня утром, проведя некоторый анализ с фреймом данных, я получил ошибку из-за наличия дублированных имен столбцов. Я попытался найти решение, используя исключительно dplyr, но я не мог найти ничего, что сработает. Вот пример, иллюстрирующий проблему. Блок данных с дублированным именем столбца.удалить дублированный столбец dplyr

x <- data.frame(matrix(c(1, 2, 3), 
       c(2,2,1),nrow=2,ncol=3)) 
colnames(x) <- c("a", "a", "b") 

Когда я пытаюсь бросить первый столбец с помощью выбора команды я получаю ошибку

x %>% 
    select(-1)%>%filter(b>1) 

Error: found duplicated column name: a 

я могу избавиться от колонки легко, используя традиционную индексацию и используя dplyr для фильтрации по значению

x<-x[,-1]%>%filter(b>1) 

Которая производит желаемый результат

> x 
    a b 
1 2 3 
2 2 3 

Любые идеи о том, как это сделать, используя только грамматику dplyr?

+2

Ну в базе R, «право» вероятно, это 'x [! duplicated (names (x), fromLast = TRUE)]'. Просто найдите способ подбросить это в глагол 'select' dplyr. Да, даже 'x%>% select (2,3)' не работает, скуля о LHS, прежде чем смотреть на предложение 'select'. Я бы назвал это ошибкой. Обходной путь: 'x%>% do (. [! Duplicated (names (.), FromLast = TRUE)])' – Frank

+0

Обычно я просто использую 'make.names', чтобы переименовать все на законных основаниях. – alistaire

+1

Если вы копаете, я думаю, что вы найдете корень зла здесь, заключается в том, что plyr и dplyr используют имена столбцов для выбора данных. Это НЕОБХОДИМО, что столбцы имеют уникальные имена, они не выбираются по имени и содержимому. Базовый пакет использует индексы, которые будут работать независимо от парадигм имен. Это предел пакета, который стоит лимита большую часть времени. – sconfluentus

ответ

2

Это может сработать, воспользовавшись поведением make.names. Не знаю, обманул ли я здесь, но, похоже, в основном использовать функции dplyr.

x %>% 
    setNames(make.names(names(.), unique = TRUE)) %>% 
    select(-matches("*\\.[1-9]+$")) 
0

Если вы хотите, чтобы избавиться от первой колонки полностью, я бы просто сделать

x <- x[, c(2:3)] 

Или же вы можете переименовать его

colnames(x)[1] <- "a.1" 
Смежные вопросы