Статистика R: Как точно сказать слово?

Я хотел бы получить "азот" в следующем символьном векторе и хотите получить назад только запись, которая содержит «азот»; и ничего от остального (например, фиксация азотом):

<code>varnames=c("nitrogen", "dissolved organic nitrogen", "nitrogen fixation", "total dissolved nitrogen", "total nitrogen")
</code>

Я попробовал что-то вроде этого:

<code>grepl(pattern= "![[:space:]]nitrogen![[:space:]]", varnames)
</code>

Но это не работает. Я надеюсь, что кто-нибудь может помочь мне с этой задачей.

 Dason06 апр. 2012 г., 11:55
Таким образом, вам просто нужны индексы / индексы значений, которые в точности равны & quot; азоту & quot ;? Есть лиwhich(varnames == "nitrogen") дать тебе то, что ты хочешь?
 sabsirro06 апр. 2012 г., 12:00
Большое спасибо, это именно то, что мне нужно.
 Carl Witthoft06 апр. 2012 г., 13:16
Дейсон: можешь ли ты сделать свой комментарий ответом, чтобы Сабсирро мог принять?

Ответы на вопрос(3)

Или использоватьfixed = TRUE если вы хотите сопоставить фактическую строку (regexбезвольно):

v <- sample(c("nitrogen", "potassium", "hidrogen"), size = 100, replace = TRUE, prob = c(.8, .1, .1))
grep("nitrogen", v, fixed = TRUE)
# [1]   3   4   5   6   7   8   9  11  12  13  14  16  19  20  21  22  23  24  25
# [20]  26  27  29  31  32  35  36  38  39  40  41  43  44  46  47  48  49  50  51
# [39]  52  53  54  56  57  60  61  62  65  66  67  69  70  71  72  73  74  75  76
# [58]  78  79  80  81  82  83  84  85  86  87  88  89  91  92  93  94  95  96  97
# [77]  98  99 100

Не знаю о проблемах со скоростью, мне нравится тестировать вещи и утверждать, что подход A быстрее, чем подход B, но в теории, по крайней мере из моего опыта, индексные / бинарные операторы должны быть самыми быстрыми, поэтому я голосую за подход @ Dason. , Также обратите внимание, чтоregexэтоalways медленнее чемfixed = TRUE grepING.

Небольшое доказательство прилагается ниже. Обратите внимание, что это неудачный тест, иsystem.time следует положить внутрьreplicate чтобы получить (более) точные различия, вы должны принять во внимание выбросы и т. д. Но, безусловно, это доказывает, что вы должны использоватьwhich! =)

(a0 <- system.time(replicate(1e5, grep("^nitrogen$", v))))
# user  system elapsed 
# 5.700   0.023   5.724  
(a1 <- system.time(replicate(1e5, grep("nitrogen", v, fixed = TRUE))))
# user  system elapsed 
# 1.147   0.020   1.168 
(a2 <- system.time(replicate(1e5, which(v == "nitrogen"))))
# user  system elapsed 
# 1.013   0.020   1.033 
 sabsirro06 апр. 2012 г., 19:18
Он, танки для этого подробного ответа. Полезно знать об этих различиях.
Решение Вопроса

Чтобы получить индексы, которые точно равны «азоту» вы могли бы использовать

which(varnames == "nitrogen")

В зависимости от того, что вы хотите сделать, вам может даже не понадобиться «который»; какvarnames == "nitrogen" дает логический вектор ИСТИНА / ЛОЖЬ. Если вы просто хотите сделать что-то подобное, замените все вхождения «азот» с "кислородом" этого должно хватить

varnames[varnames == "nitrogen"] <- "oxygen"

Хотя ответ Дэйсона проще, вы можете сделать точное совпадение, используя grep через:

varnames=c("nitrogen", "dissolved organic nitrogen", "nitrogen fixation", "total dissolved nitrogen", "total nitrogen")

grep("^nitrogen$",varnames,value=TRUE)
[1] "nitrogen"

grep("^nitrogen$",varnames)
[1] 1
 06 апр. 2012 г., 18:48
Это работает, но медленно. Если вы не строитеregexдинамически, в этом нет большого смысла^someword$.
 06 апр. 2012 г., 15:27
Ответ Дэнсона не просто проще, он также быстрее.
 sabsirro06 апр. 2012 г., 15:41
Да, это тоже работает. Спасибо.

Ваш ответ на вопрос