#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. Спасибо! Я проверю это