我的问题是提高我的代码的效率/优雅。我有一个带有药物清单的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' 会在某些情况下捕获我不想要的东西,所以我需要让它尽可能窄。