2013-12-04 4 views
2

Мне нужна помощь с чем-то, что может быть довольно простым в R. Я хочу обратиться к диапазону столбцов в фрейме данных (например, извлечение нескольких переменных выбора). Однако я не знаю их номеров столбцов. Обычно, если бы я хотел выделить столбцы 4-10, я бы сказал mydata [, 4: 10].относятся к диапазону столбцов по имени в R

Однако, учитывая, что я не знаю номера столбцов, я хотел бы обратиться к ним по имени. Есть простой способ сделать это? в sas или spss довольно легко обратиться к диапазону переменных по имени. Альтернативно, есть ли простой способ выяснить, какой номер столбца соответствует имени переменной в R?

ответ

2

номер столбца может быть идентифицирован с именем столбца в пределах кадра данных следующим образом:

which(colnames(mydf)=="a") 

, где mydf представляет собой фрейм данных и это имя столбца номер столбца требуется для.

(Source)

Это может быть использовано для создания диапазона столбцов:

firstcol = which(colnames(x)=="a") 
lastcol = which(colnames(x)=="b") 

mydf[c(firstcol:lastcol)] 
5

Получение ряда столбцов может быть выполнено несколькими способами. subset(data.frame, select = name4:name10), работает, но довольно длинный. Я использовал это, прежде чем я рассердился, написав длинные команды для простой вещи. Я сделал функцию, чтобы решать столбцы именования/не помнят номера столбцов в больших кадрах данных:

coln <- function(X){ 
    y <- rbind(seq(1,ncol(X))) 
    colnames(y) <- colnames(X) 
rownames(y) <- "col.number" 
    return(y)} 

Вот как это работает:

df <- data.frame(a = 1:10, b =10:1, c = 1:10) 
coln(df) 
      a b c 
col.number 1 2 3 

Теперь вы можете называть их с числами и по-прежнему смотреть на имена.

+1

Я буду голосовать за 'подмножество (DF, выберите = ...)' –

+0

Мне нравится стратегия здесь , Я буду использовать это в сочетании с другим кодом. – tcarpenter

+0

Если вы считаете, что это правильный ответ, вы должны выбрать его, используя отметку в левой части текста. Это получает очки для пользователя, который ответил. Так работает Stack Overflow. – SlowLearner

1

Я думаю, что я понял, но это немного ornery. Вот пример использования mtcars для получения столбцов между hp и vs. do.call, как правило, означает, что есть более простой способ.

mtcars[do.call(seq, as.list(match(c("hp", "vs"), colnames(mtcars))))] 
2

Использование %in% в сочетании с names(). Это полезно для захвата группы столбцов из фрейма данных. Вы можете отрицать выражение, когда хотите сохранить только подмножество и оставить все остальное. Введите ?"%in%" в командной строке R для получения более подробной информации.

set.seed(1234) 
mydf <- data.frame(A = runif(5, 1, 2), 
        B = runif(5, 3, 4), 
        C = runif(5, 5, 6), 
        D = runif(5, 7, 8), 
        E = runif(5, 9, 10)) 
mydf 

keep.cols <- c('A','D','E') 
mydf[, names(mydf) %in% keep.cols] 
drop.cols <- c('A','B','C') 
mydf[, !names(mydf) %in% drop.cols] 

Кадр данных:

> mydf 
     A  B  C  D  E 
1 1.113703 3.640311 5.693591 7.837296 9.316612 
2 1.622299 3.009496 5.544975 7.286223 9.302693 
3 1.609275 3.232551 5.282734 7.266821 9.159046 
4 1.623379 3.666084 5.923433 7.186723 9.039996 
5 1.860915 3.514251 5.292316 7.232226 9.218800 

Подмножество столбцов:

> mydf[, names(mydf) %in% keep.cols] 
     A  D  E 
1 1.113703 7.837296 9.316612 
2 1.622299 7.286223 9.302693 
3 1.609275 7.266821 9.159046 
4 1.623379 7.186723 9.039996 
5 1.860915 7.232226 9.218800 

Сохранение подмножества столбцов и опуская остальное:

> mydf[, !names(mydf) %in% drop.cols] 
     D  E 
1 7.837296 9.316612 
2 7.286223 9.302693 
3 7.266821 9.159046 
4 7.186723 9.039996 
5 7.232226 9.218800 
0

Вот забавная небольшая функция, которая сочетает в себе e идеи за ответ Largh с удобным вызовом функции. Чтобы использовать его, просто введите

call.cols (MyData, "firstvarname", "lastvarname")

call.cols <- function(df, startvar, endvar) { 
    col.num <- function(df){ 
    var.nums <- seq(1,ncol(df)) 
    names(var.nums) <- colnames(df)  
    return(var.nums) 
    } 

start.num <- as.numeric(col.num(df)[startvar]) 
end.num <- as.numeric(col.num(df)[endvar]) 
range.num <- start.num:end.num 
return(df[range.num]) 
} 

Я планирую расширить это использовать для масштабного создания для психометрических исследований.

+1

Недостатком вашей функции является то, что вы не можете подмножать колонки вне диапазона. С 'подмножеством' вы можете. Например: 'subset (swiss, select = c (Fertility, Education: Infant.Mortality))'. Аналогичным образом вы можете использовать 'coln' для получения номеров столбцов:' swiss [c (1,4: 6)] '. – Mikko

+0

Ahh. Я вижу утилиту. Полезно! – tcarpenter

Смежные вопросы