在R中消除多个串联单元的后续实例

在R中消除多个串联单元的后续实例,r,string,dataframe,substr,R,String,Dataframe,Substr,我对R比较陌生。我有一个500万次观察的数据框架和一个看起来像这样的变量: PMID-28524368 PMID-28504342 PMID-28501042 RN-4964P6T9RB(醛固酮) RN-EC 3.4.23.15(肾素) RN-RWP5GA015D(钾) MH-肾上腺皮质肿瘤/*诊断影像学/病理学/外科学 MH-肾上腺皮质腺瘤/*诊断成像/病理学/外科学 MH-醛固酮/血液 MH-人类 PMID-28523858 PMID-28517030 PMID-28513869 MH-醛

我对R比较陌生。我有一个500万次观察的数据框架和一个看起来像这样的变量:


PMID-28524368
PMID-28504342
PMID-28501042
RN-4964P6T9RB(醛固酮)
RN-EC 3.4.23.15(肾素)
RN-RWP5GA015D(钾)
MH-肾上腺皮质肿瘤/*诊断影像学/病理学/外科学
MH-肾上腺皮质腺瘤/*诊断成像/病理学/外科学
MH-醛固酮/血液
MH-人类
PMID-28523858
PMID-28517030
PMID-28513869
MH-醛固酮增多症/*并发症
MH-高血压/*病因
MH-男性
MH-中年
MH-钾/血液
PMID-28494487
PMID-28493475
MH-肾素/血液
MH-X射线计算机体层摄影术

然而,我只希望有一个PMID连续出现,而且第一个PMID——其余的PMID应该被删除,从而产生一个如下所示的数据帧:


PMID-28524368
RN-4964P6T9RB(醛固酮)
RN-EC 3.4.23.15(肾素)
RN-RWP5GA015D(钾)
MH-肾上腺皮质肿瘤/*诊断影像学/病理学/外科学
MH-肾上腺皮质腺瘤/*诊断成像/病理学/外科学
MH-醛固酮/血液
MH-人类
PMID-28523858
MH-醛固酮增多症/*并发症
MH-高血压/*病因
MH-男性
MH-中年
MH-钾/血液
PMID-28494487
MH-肾素/血液
MH-X射线计算机体层摄影术

请告知。我尝试使用:

# remove excessive PMIDs
for (i in nrow(original_reduced))
{
  if (substr(original_reduced[i, 1], 1, 4) == "PMID")
  {
    if (substr(original_reduced[i+1, 1], 1, 4) == "PMID" && i != nrow(original_reduced)) # if next row is also PMID
    {
      original_reduced <- original_reduced[-c(i+1), ] # delete entry after
    }
  }
}
#删除过多的PMID
适用于(以nrow表示的i(原始单位减少))
{
if(substr(原始_减少[i,1],1,4)=“PMID”)
{
if(substr(原始减少[i+1,1],1,4)=“PMID”&&i!=nrow(原始减少))#如果下一行也是PMID
{
原版减少试试这个:

df%>%mutate(number=sequence(rle(name)[['lengths']]))%>%filter((number==1 & grepl('PMID',number))|!grepl('PMID',name))%>%select(name)
试试这个:

df%>%mutate(number=sequence(rle(name)[['lengths']]))%>%filter((number==1 & grepl('PMID',number))|!grepl('PMID',name))%>%select(name)

这是一个有效的解决方案。有关代码的解释,请参阅注释

 df<-structure(list(V1 = c("PMID- 28524368", "PMID- 28504342", "PMID- 28501042", 
"RN - 4964P6T9RB (Aldosterone)", "RN - EC 3.4.23.15 (Renin)", 
"RN - RWP5GA015D (Potassium)", "MH - Adrenal Cortex Neoplasms/*diagnostic imaging/pathology/surgery", 
"MH - Adrenocortical Adenoma/*diagnostic imaging/pathology/surgery", 
"MH - Aldosterone/blood", "MH - Humans", "PMID- 28523858", "PMID- 28517030", 
"PMID- 28513869", "MH - Hyperaldosteronism/*complications", "MH - Hypertension/*etiology", 
"MH - Male", "MH - Middle Aged", "MH - Potassium/blood", "PMID- 28494487", 
"PMID- 28493475", "MH - Renin/blood", "MH - Tomography, X-Ray Computed"
)), .Names = "V1", row.names = c(NA, -22L), class = "data.frame")

library(dplyr)

#Add flag for PMID rows
   df$pmid<-grepl("^PMID", df$V1)
#find rows of where n == n+1
   matches<-df$pmid==lag(df$pmid)
#find rows equal to previous row and is a PMID row
   toremove<-which(matches==TRUE & df$pmid==TRUE)
#remove rows
   df<-df[-toremove,]
   df$pmid<-NULL  #remove added column

df这是一个有效的解决方案。有关代码的解释,请参阅注释

 df<-structure(list(V1 = c("PMID- 28524368", "PMID- 28504342", "PMID- 28501042", 
"RN - 4964P6T9RB (Aldosterone)", "RN - EC 3.4.23.15 (Renin)", 
"RN - RWP5GA015D (Potassium)", "MH - Adrenal Cortex Neoplasms/*diagnostic imaging/pathology/surgery", 
"MH - Adrenocortical Adenoma/*diagnostic imaging/pathology/surgery", 
"MH - Aldosterone/blood", "MH - Humans", "PMID- 28523858", "PMID- 28517030", 
"PMID- 28513869", "MH - Hyperaldosteronism/*complications", "MH - Hypertension/*etiology", 
"MH - Male", "MH - Middle Aged", "MH - Potassium/blood", "PMID- 28494487", 
"PMID- 28493475", "MH - Renin/blood", "MH - Tomography, X-Ray Computed"
)), .Names = "V1", row.names = c(NA, -22L), class = "data.frame")

library(dplyr)

#Add flag for PMID rows
   df$pmid<-grepl("^PMID", df$V1)
#find rows of where n == n+1
   matches<-df$pmid==lag(df$pmid)
#find rows equal to previous row and is a PMID row
   toremove<-which(matches==TRUE & df$pmid==TRUE)
#remove rows
   df<-df[-toremove,]
   df$pmid<-NULL  #remove added column

d您的代码删除了所有的pmid…我假设
lag
函数没有正常工作…看起来很有希望,但是dplyr库加载了吗?如果使用基本包的lag函数,这将不起作用。我通过在
lag
函数中添加n=1来修复它…谢谢!!!
匹配您删除的代码所有的PMID…我假设
lag
函数没有正常工作…看起来很有希望,但是dplyr库加载了吗?如果使用基本包的lag函数,这将不起作用。我通过在
lag
函数中添加n=1来修复它…谢谢!!!
匹配