Как установить несколько столбцов из df, включая grep match - PullRequest
1 голос
/ 08 октября 2019

У меня очень большой набор данных, который включает несколько столбцов с общими частями их имен (например, ctq_1, ctq_2, ctq_3, а также panas_1, panas_2, panas_3). Я хотел бы установить некоторые из этих столбцов (например, только те, которые содержат 'panas' в имени столбца) вместе с некоторыми другими столбцами из того же фрейма данных, которые имеют уникальные имена (например, id, group).

Я пытался использовать функцию grep в квадратных скобках, которая хорошо работала: panas <- bigdata [, grep ('panas', colnames (bigdata))]], но теперь мне нужно разобраться, как включитьдругие два столбца, которые мне нужны, это id и группа. Я пробовал: panas <- bigdata [, c ('id', 'group', grep ('panas', colnames (bigdata)))], но я получаю эту ошибку: Ошибка: не удается найти столбцы <code>114, 115, 116, 117, 118,… (и еще 15) в .data. Позвоните rlang::last_error(), чтобы увидеть обратный след.

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

Вот воспроизводимый пример.


> head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

> newframe <- iris[ , grep('Petal', colnames(iris))] # This works

> newframe <- iris[ , c('Species', grep('Petal', colnames(iris)))] # This doesn't work

На этот раз ошибка:

Ошибка в [.data.frame (радужная оболочка,, c («Виды», grep («Лепесток», названия столбцов (радужная оболочка)))): выбраны неопределенные столбцы

Ответы [ 2 ]

1 голос
/ 08 октября 2019

Предполагая, что я понял, что вы хотели бы сделать, возможное решение, которое может оказаться бесполезным и / или может быть избыточным:

my_selector <- function(df,partial_name,...){
  positional_names <- match(...,names(df))
  df[,c(positional_names,grep(partial_name,names(df)))]
}
my_selector(iris, partial_name = "Petal","Species")

"Более простым" вариантом будет использование grep инапример, чтобы соответствовать целевым именам сразу:

iris[grep("Spec.*|Peta.*", names(iris))]

Или даже проще, как предлагает @akrun, мы можем просто сделать:

iris[grep("(Spec|Peta).*", names(iris))]

Для большего количества столбцов мы могли бы сделатьчто-то вроде:

my_selector(iris, partial_name = "Petal",c("Species","Sepal.Length"))
       Species Sepal.Length Petal.Length Petal.Width
1       setosa          5.1          1.4         0.2
2       setosa          4.9          1.4         0.2

Обратите внимание , однако, что в вышеупомянутой функции столбцы выбираются нелогично, так как имена, предоставленные последними, выбираются первыми. для первой части (усечено):

         Species Petal.Length Petal.Width
1       setosa          1.4         0.2
2       setosa          1.4         0.2
3       setosa          1.3         0.2
4       setosa          1.5         0.2
5       setosa          1.4         0.2
6       setosa          1.7         0.4
7       setosa          1.4         0.3
1 голос
/ 08 октября 2019

grep возвращает положение совпадения, и вы не можете смешивать имена столбцов и положение при подстановке столбцов. Либо подмножество полностью по именам или по положению.

Для подмножества по имени выполните

panas <- bigdata[,c('id', 'group', grep('panas', colnames(bigdata), value = TRUE))] 

Или для подмножества по позиции

panas <- bigdata[ , c(1:2, grep('panas', colnames(bigdata))]

при условии, что 1:2 - это позиция столбца id и group.

...