Как удалить дублированные имена столбцов в R?

У меня очень большая матрица, я знаю, что некоторые из них имеют дубликаты. поэтому я просто хочу найти эти дублированные имена и удалить из столбца из дубликата. Я попробовал duplicate(), но удаляет повторяющиеся записи. Кто-нибудь поможет мне внедрить это в R? Дело в том, что дублировать colnames, возможно, не дублировать.

Ответ 1

Скажем, temp - ваша матрица

temp <- matrix(seq_len(15), 5, 3)
colnames(temp) <- c("A", "A", "B")

##      A  A  B
## [1,] 1  6 11
## [2,] 2  7 12
## [3,] 3  8 13
## [4,] 4  9 14
## [5,] 5 10 15

Вы могли бы сделать

temp <- temp[, !duplicated(colnames(temp))]

##      A  B
## [1,] 1 11
## [2,] 2 12
## [3,] 3 13
## [4,] 4 14
## [5,] 5 15

Или, если вы хотите сохранить последний дублированный столбец, вы можете сделать

temp <- temp[, !duplicated(colnames(temp), fromLast = TRUE)] 

##       A  B
## [1,]  6 11
## [2,]  7 12
## [3,]  8 13
## [4,]  9 14
## [5,] 10 15

Ответ 2

Или, предположив data.frames, вы можете использовать subset:

subset(iris, select=which(!duplicated(names(.)))) 

Обратите внимание, что dplyr::select здесь не применим, поскольку он требует уникальности столбца во входных данных.

Ответ 3

Храните все ваши дубликаты в один вектор, повторяя дубликаты, и используйте -duplicates с одним подмножеством скобок для удаления повторяющихся столбцов.

       # Define vector of duplicate cols (don't change)
       duplicates <- c(4, 6, 11, 13, 15, 17, 18, 20, 22, 
            24, 25, 28, 32, 34, 36, 38, 40, 
            44, 46, 48, 51, 54, 65, 158)

      # Remove duplicates from food and assign it to food2
         food2 <- food[,-duplicates]

Ответ 4

Чтобы удалить определенный дубликат столбца по имени, вы можете сделать следующее:

test = cbind(iris, iris) # example with multiple duplicate columns
idx = which(duplicated(names(test)) & names(test) == "Species")
test = test[,-idx]

Чтобы удалить все дублированные столбцы, это немного проще:

test = cbind(iris, iris) # example with multiple duplicate columns
idx = which(duplicated(names(test)))
test = test[,-idx]

или же:

test = cbind(iris, iris) # example with multiple duplicate columns
test = test[,!duplicated(names(test))]