Как получить все столбцы с одинаковым именем столбца в R одновременно? - PullRequest
3 голосов
/ 23 сентября 2019

Допустим, у меня есть следующий фрейм данных:

> test <- cbind(test=c(1, 2, 3), test=c(1, 2, 3))
> test
     test test
[1,]    1    1
[2,]    2    2
[3,]    3    3

Теперь из такого фрейма данных я хочу извлечь все столбцы с именем "test" в новый фрейм данных:

> new_df <- test[, "test"]

Однако эта последняя попытка выполнить выборку только первого столбца с именем «test» во фрейме тестовых данных:

> new_df
[1] 1 2 3

Как мне получить все столбцы с именем «test» в этом примере и поместить ихв новый фрейм данных в одной команде?В моих реальных данных у меня есть много столбцов с повторяющимися именами столбцов, и я не знаю индекса столбцов, поэтому не могу получить их по номеру.

1 Ответ

2 голосов
/ 23 сентября 2019

Не рекомендуется иметь одинаковые имена столбцов по практическим соображениям.Но мы можем сделать сравнение (==), чтобы получить логический вектор, и использовать его для извлечения столбцов

i1 <- colnames(test) == "test"
new_df <- test[, i1, drop = FALSE]

Обратите внимание, что data.frame не допускает дублирование имен столбцов и будетизмените его на уникальный, добавив .1 .2 и т. д. в конце с make.uniquematrix (набор данных OP), позволяет иметь повторяющиеся имена столбцов или имена строк (хотя не рекомендуется)


Кроме того, если есть несколько имен столбцов, которые повторяются и хотите выбрать их какОтдельные наборы данных, используйте split

lst1 <- lapply(split(seq_len(ncol(test)), colnames(test)), function(i)
            test[, i, drop = FALSE])

Или прокрутите имена столбцов unique и выполните ==, циклически просматривая его с помощью lapply

lst2 <- lapply(unique(colnames(test)), function(nm) 
             test[, colnames(test) == nm, drop = FALSE])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...