Вектор логики, основанный на членстве в строке - PullRequest
3 голосов
/ 08 февраля 2011

спасибо за ваше терпение.

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

Лекарства трудно кодировать, так как они (как правило) бессмысленны, если не совмещены с дозами.

У меня есть дата-кадр с векторами (Drug1, Drug2 ..... Drug 16), где отдельные пациенты представлены рядами. Векторы на самом деле являются факторами, с сотнями возможных уровней (все лекарства, которые может принимать пациент).

Все, что я хочу сделать, это создать вектор логики (TTTTFFFFTTT ......), который я мог бы затем привязать к информационному фрейму, который скажет мне, принимает ли пациент какой-то конкретный препарат или нет. *

Тогда я мог бы использовать присутствие или отсутствие особо важных лекарств в качестве категориальных ковариат в модели.

Я пробовал grep для поиска по строкам, и я могу сгенерировать вектор идентификаторов, но я не могу сгенерировать вектор логики.

Я понимаю, что делаю что-то просто неправильно.

names(drugindex)
 [1] "book.MRN" "DRUG1"    "DRUG2"    "DRUG3"    "DRUG4"    "DRUG5"  
 [7] "DRUG6"    "DRUG7"    "DRUG8"    "DRUG9"    "DRUG10"   "DRUG11"  
[13] "DRUG12"   "DRUG13"   "DRUG14"   "DRUG15"   "DRUG16"  

> truvec<-drugindex$book.MRN[as.vector(unlist(apply(drugindex[,2:17], 2, grep, pattern="Lamotrigine")))]
> truvec
truvec
[1] 0024633  0008291  0008469  0030599  0027667
37 Levels: 0008291  0008469  0010188  0014217  0014439  0015822  ... 0034262

> head(drugindex)
   book.MRN       DRUG1        DRUG2          DRUG3        DRUG4        DRUG5
4  0008291  Venlafaxine Procyclidine  Flunitrazepam Amisulpiride    Clozapine
31 0008469  Venlafaxine  Mirtazapine        Lithium   Olanzapine   Metoprolol
3  0010188   Flurazepam    Valproate     Olanzapine  Mirtazapine Esomeprazole
13 0014217      Aspirin     Ramipril Zuclopenthixol    Lorazepam  Haloperidol
15 0014439    Zopiclone     Diazepam    Haloperidol  Paracetamol         <NA>
5  0015822   Olanzapine  Venlafaxine        Lithium  Haloperidol   Alprazolam
         DRUG6      DRUG7      DRUG8      DRUG9          DRUG10 DRUG11 DRUG12
4  Lamotrigine Alprazolam    Lithium Alprazolam            <NA>   <NA>   <NA>
31 Lamotrigine   Ramipril Alprazolam   Zolpidem Trifluoperazine   <NA>   <NA>
3  Paracetamol Alprazolam Citalopram       <NA>            <NA>   <NA>   <NA>
13        <NA>       <NA>       <NA>       <NA>            <NA>   <NA>   <NA>
15        <NA>       <NA>       <NA>       <NA>            <NA>   <NA>   <NA>
5         <NA>       <NA>       <NA>       <NA>            <NA>   <NA>   <NA>
   DRUG13 DRUG14 DRUG15 DRUG16
4    <NA>   <NA>   <NA>   <NA>
31   <NA>   <NA>   <NA>   <NA>
3    <NA>   <NA>   <NA>   <NA>
13   <NA>   <NA>   <NA>   <NA>
15   <NA>   <NA>   <NA>   <NA>
5    <NA>   <NA>   <NA>   <NA>

И то, что я хочу, - это вектор логики для каждого лекарства, говорящий, включен ли этот пациент

Спасибо всем за потраченное время.

Росс Данн MRCPsych

"Вероятность того, что это возможно, еще не все".

Ответы [ 2 ]

9 голосов
/ 08 февраля 2011

Вы были близки с вашей попыткой apply, но MARGIN=2 применяет функцию к столбцам, а не к строкам.Кроме того, grep возвращает местоположения совпадений;Вы хотите grepl, который возвращает логический вектор.Попробуйте это:

apply(x[,-1], 1, function(x) any(grepl("Aspirin",x)))

Вы также можете использовать %in%, что может показаться более интуитивным:

apply(x[,-1], 1, "%in%", x="Aspirin")
4 голосов
/ 09 февраля 2011

Во-первых, комментарий к структуре данных.У вас есть данные в том, что некоторые называют «широким» форматом, с одной строкой на пациента и несколькими столбцами для лекарств.Обычно бывает так, что «длинный» формат с повторяющимися строками на пациента и одним столбцом для лекарств более поддается манипулированию данными.Чтобы изменить ваши данные с широкого на длинный и наоборот, взгляните на пакет изменения формы.В этом случае у вас будет что-то вроде:

library(reshape)
dnow <- melt(drugindex, id.var='book.MRN')
subset(dnow, value=='Lamotrigine')

Гораздо чище и понятнее код, если можно так сказать ...

Редактировать: Если вам нужна старая структураВы можете использовать cast:

cast(subset(dnow, value=='Lamotrigine'),  book.MRN ~ value)

, как предложено @jonw в комментариях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...