Получить значения столбцов на основе вектора имен (в R)

#r #string

#r #строка

Вопрос:

У меня есть фрейм данных с именованными столбцами.

Давайте предположим:

 > colnames(df)
[1] "apple"   "orange"   "banana"   "pear"   "melon"
  

Я хочу получить индексы столбцов, которые соответствуют строкам в векторе.

 > myNames = c("apple","pear")
> foo(myNames,colnames(df))
[1] 1 4
  

Первоначально на ум приходили which() и %in% , но ни один из них не работал в моей реализации из-за того, что входными данными были оба вектора; примеры для полноты картины:

 > which(colnames(df) == myNames )
> myNames %in% colnames(df)
  

Была бы признательна за любую помощь о том, как сделать это без цикла.

Комментарии:

1. Может быть, вы ищете match ?

Ответ №1:

which и %in% являются одним из вариантов

 x <- c("apple", "orange", "banana", "pear", "melon")
myNames = c("apple","pear")

which(x %in% myNames)
[1] 1 4
  

Еще один match

 match(myNames, x)
[1] 1 4
  

Комментарии:

1. Большое вам спасибо! Оба работают. Я использовал %в% наоборот, и это было моей проблемой. Согласно вашему ответу, это должно было быть colnames(df) %in% myNames , в то время как у меня было наоборот. match() определенно является более компактным решением.

Ответ №2:

Вы можете использовать grep, чтобы находить их один за другим следующим образом:

 grep("apple",df)
  

или используйте это:

 colno=function(vector,df){
  result=c()
  a=length(vector)

  for(i in 1:a){
    result[i]=grep(vector[i],colnames(df))}
  return(result)}
  

Затем назовите это как,

 colno(myNames,df)
  

Надеюсь, это поможет

Комментарии:

1. К вашему сведению, обычно это делается for (i in seq_along(vector)) , поскольку длина может быть равна нулю, и в этом случае у вас есть 1: 0. Кроме того, вы можете инициализировать result = integer(length(vector)) , что более эффективно, чем его динамическое увеличение. В бесплатной книге под названием «R Inferno» есть еще такие R-подводные камни, если вам интересно.

2. Спасибо за совет seq_along! Я читал Inferno, но там не так много, что я могу запомнить, не практикуя каждую концепцию.

3. Спасибо! Я проверю это