0

我的问题是提高我的代码的效率/优雅。我有一个带有药物清单的df。我想识别以 C09 和 C10 开头的药物。如果一个人有这些药物,我想给他们一个二元指标(1=是,0=否)他们是否有这些药物。二进制指标将位于同一数据帧中名为“statins”的新列中。我以这篇文章为指导:SQL 的 LIKE 'description%' 语句的 R 等价物是什么?.

这是我所做的;

names<-c("tom", "mary", "mary", "john", "tom", "john", "mary", "tom", "mary", "tom", "john")
drugs<-c("C10AA05", "C09AA03", "C10AA07", "A02BC01", "C10AA05", "C09AA03", "A02BC01", "C10AA05", "C10AA07", "C07AB03", "N02AA01")
df<-data.frame(names, drugs)
df

  names   drugs
1    tom C10AA05
2   mary C09AA03
3   mary C10AA07
4   john A02BC01
5    tom C10AA05
6   john C09AA03
7   mary A02BC01
8    tom C10AA05
9   mary C10AA07
10   tom C07AB03
11  john N02AA01

ptn = '^C10.*?'
get_statin = grep(ptn, df$drugs, perl=T)
stats<-df[get_statin,]

names   drugs
1   tom C10AA05
3  mary C10AA07
5   tom C10AA05
8   tom C10AA05
9  mary C10AA07


ptn2='^C09.*?'
get_other=grep(ptn2, df$drugs, perl=T)
other<-df[get_other,]
other

  names   drugs
2  mary C09AA03
6  john C09AA03

df$statins=ifelse(df$drugs %in% stats$drugs,1,0)
df

   names   drugs statins
1    tom C10AA05       1
2   mary C09AA03       0
3   mary C10AA07       1
4   john A02BC01       0
5    tom C10AA05       1
6   john C09AA03       0
7   mary A02BC01       0
8    tom C10AA05       1
9   mary C10AA07       1
10   tom C07AB03       0
11  john N02AA01       0


df$statins=ifelse(df$drugs %in% other$drugs,1,df$statins)
df

   names   drugs statins
1    tom C10AA05       1
2   mary C09AA03       1
3   mary C10AA07       1
4   john A02BC01       0
5    tom C10AA05       1
6   john C09AA03       1
7   mary A02BC01       0
8    tom C10AA05       1
9   mary C10AA07       1
10   tom C07AB03       0
11  john N02AA01       0

所以,我可以得到我想要的——但我觉得可能有更好、更好的方法来做到这一点,并且希望在这里得到任何指导。一个明显的解决方案,我能感觉到你们都在屏幕上大喊大叫,就是使用 '^C' 作为模式 - 因此捕获所有以 C 开头的药物。在我的主要分析中,我无法做到这一点,因为C' 会在某些情况下捕获我不想要的东西,所以我需要让它尽可能窄。

4

1 回答 1

5

干得好:

transform(df, statins=as.numeric(grepl('^C(10|09)', drugs)))
于 2013-06-28T19:41:30.207 回答