2016-08-05 3 views
0

У меня есть Dataframe из двух столбцов. Колонка 1 является идентификационным номером, а столбец 2 представляет собой соединение. Однако соединения в колонке 2 часто повторяются (различные формы того же соединения). Я хотел бы удалить каждый дубликат, кроме простой формы соединения.Удаление квазидубликатов из R Dataframe

Это Dataframe:

>NISTSpecR 

    NIST              NAME 
    366620        Formic acid, TMS derivative 
    366765 2-[2-(2-Butoxyethoxy)ethoxy] Acetic acid, TMS derivative 
    342340        Acetic acid, TMS derivative 
    352374       Propanoic acid, TMS derivative 
    333858        Butyric Acid, TMS derivative 
    352377       Pentanoic acid, TMS derivative 
    24239       Hexanoic acid, TMS derivative 
    333733       Heptanoic acid, TMS derivative 
    352455        Oxalic acid, 2TMS derivative 
    414056     Succinic acid, monoethyl ester-, (TMS) 
    332809        Adipic acid, TMS derivative 
    30799       Pimelic acid, 2TMS derivative 
    292699       Suberic acid, 2TMS derivative 
    333874        Citric acid, 4TMS derivative 
    366657        Citric acid, 3TMS derivative 
    333513       (-)-Epinephrine, 3TMS derivative 
    16985     Epinephrine, (.beta.)-, 3TMS derivative 
    24795     Norepinephrine, (R)-, 5TMS derivative 
    332935      DL-Norepinephrine, 4TMS derivative 

А вот его структура:

> str(NISTSpecR) 

'data.frame': 154 obs. of 3 variables: 
$ Spec: Factor w/ 239429 levels "1 0; 13 2; 14 27; 15 239; 16 3; 18 2; 26 3; 27 36; 28 32; 29 113; 30 9; 31 64; 32 9; 33 17; 34 17; 35 20; 36 1; 37 1; 41 8; 42 "| __truncated__,..: 23720 32791 3011 32175 12349 29069 193166 26108 28713 73845 ... 
$ NIST: chr "366620" "366765" "342340" "352374" ... 
$ NAME: Factor w/ 239430 levels "-4'-Dimethylamino-2'-(trimethylsilyl)acetanilide",..: 157152 39442 108436 210392 133148 199151 169386 168243 195800 229235 ... 

Я хотел бы конечный результат, чтобы выглядеть примерно так:

>NISTSpecR 

    NIST              NAME 
    366620        Formic acid, TMS derivative 
    342340        Acetic acid, TMS derivative 
    352374       Propanoic acid, TMS derivative 
    333858        Butyric Acid, TMS derivative 
    352377       Pentanoic acid, TMS derivative 
    24239       Hexanoic acid, TMS derivative 
    333733       Heptanoic acid, TMS derivative 
    352455        Oxalic acid, 2TMS derivative 
    414056     Succinic acid, monoethyl ester-, (TMS) 
    332809        Adipic acid, TMS derivative 
    30799       Pimelic acid, 2TMS derivative 
    292699       Suberic acid, 2TMS derivative 
    366657        Citric acid, 3TMS derivative 
    333513       (-)-Epinephrine, 3TMS derivative 
    24795     Norepinephrine, (R)-, 5TMS derivative 

Eсть только одно из каждого исходного соединения (т. е. муравьиная кислота, ...). И это должна быть самая простая версия (одна с наименьшими символами).

> dput(as.character(NISTSpecR$NAME)) 

c("Formic acid, TMS derivative", "2-[2-(2-Butoxyethoxy)ethoxy] Acetic acid, TMS derivative", 
"Acetic acid, TMS derivative", "Propanoic acid, TMS derivative", 
"Butyric Acid, TMS derivative", "Pentanoic acid, TMS derivative", 
"Hexanoic acid, TMS derivative", "Heptanoic acid, TMS derivative", 
"Oxalic acid, 2TMS derivative", "Succinic acid, monoethyl ester-, (TMS)", 
"Adipic acid, TMS derivative", "Pimelic acid, 2TMS derivative", 
"Suberic acid, 2TMS derivative", "Citric acid, 4TMS derivative", 
"Citric acid, 3TMS derivative", "Citric acid 3TMS", "Citric acid, ethyl ester, tri-TMS", 
"Isocitric acid lactone, 2TMS derivative", "Glyoxylic acid, di-TMS", 
"Pyruvic acid, TMS derivative", "Malic acid, 2TMS derivative", 
"Malic acid 1-ethyl ester, 2TMS", "Malic acid, 4-ethyl ester, 2TMS", 
"Malic acid, 3TMS derivative", "4-Hydroxybutanoic acid, 2TMS derivative", 
"Prostaglandin A1, 2TMS derivative", "Prostaglandin A2, 2TMS derivative", 
"Prostaglandin E2, 3TMS", "D-Arabinose, 4TMS derivative", "D-Xylose, 4TMS derivative", 
"D-Lyxose, 4TMS derivative", "D-Ribose, 4TMS derivative", "D-Glucose, 5TMS derivative", 
"D-Galactose, 5TMS derivative", "D-Mannose, 5TMS derivative", 
"D-Allose, oxime (isomer 1), 6TMS derivative", "D-Allose, oxime (isomer 2), 6TMS derivative", 
"D-Altrose, 5TMS derivative", "Dihydroxyacetone, 2TMS derivative", 
"1,3-Dihydroxyacetone dimer, 4TMS derivative", "D-Fructose, 5TMS  derivative", 

"Д-Psicose, 5TMS производной", "седогептулоза, 6TMS производной", "D-2-дезоксирибозы, 3TMS производного", "2-дезоксирибозы, 3TMS производная", «L-фукоз, 4TMS производное "," L-Рамноза, (R, R, S, S) -, 4TMS производное ", " L-Рамноза, производное 4TMS "," N-ацетил-D-глюкозамин, производное 4TMS ", " D «Гликоновая кислота, производное 6TMS», «Моностеарат глицерина», производное 2TMS », « Глицерин-2-лаурат, производное 2TMS »,« Глицерин, производное 3TMS », « Xylitol, производное 5TMS »,« D-сорбит, производное 6TMS », , «D-Mannitol, производное 6TMS», «Сахароза, производное 8TMS», «D-лактоза , (изомер 1), производное 8TMS ", " -D-лактоза, (изомер 1), производное 8TMS "," D-лактоза, (изомер 2), производное 8TMS ", " -B -лактоза, (изомер 2), производное 8ТМС "," -D-лактоза, производное 8TMS ", " -D-лактоза, производное 8TMS "," -Лактоза, производное 8TMS ", «Лактоза, производное 8TMS», «Мальтоза, производное 8TMS, изомер 1», «Мальтоза, производное 8TMS, изомер 2», «Мальтоза, производное 8TMS», «D-Trehalose, производное 7TMS», «Melibiose, 8TMS производное ", " L-орнитин, производное 3TMS "," DL-орнитин, производное 3TMS ", " DL-орнитин, производное 4TMS "," L-орнитин, производное 4TMS ", " L-гомосерин, производное 2TMS " , "L-Citrulline, производное 3TMS", - 3-йод-L-тирозин, 3TMS-производное "," 3-Аминоизомасляная кислота, производное ТМС ", " 3-Аминоизомасляная кислота, 3TMS производное "," 3-Аминоизомасляная кислота, производное 2TMS ", " D-Isoleucine , N-ацетил-, производное ТМС "," L-гидроксипролин, (E) -, производное 2TMS ", " L-гидроксипролин, (E) -, производное 3TMS "," Гидроксипролин, производное 3TMS ", " 3- «Этаноламин, производное 3TMS», «Этаноламин, производное 2TMS», «3-Аминопропанол, производное ТМС», «Путрескин, производное 4TMS», «Гистамин», «Липид», «L-цистин», «4TMS производное», «Этаноламин, , Производное 2TMS "," Гистамин, производное 3TMS "," Допамин, производное 4TMS ", " Допамин, производное 3TMS "," Серотонин, производное 4TMS "," Тирамин, производное 3TMS ", «Тирамин, производное ТМС», «Тирамин, производное 2 ТМС», «Фениламин, производное 2ТМС», «1-Фениламин, производное ТМС», «Фениэтиламин, производное ТМС», «Биотин, производное 3 ТМС», «16. beta ;, 17α-Estriol, 3TMS-производное ", " Эстриол, производное 3TMS "," 16α, 17-Estriol, производное 3TMS ", " 16, 17b.-эстриол, производное 3ТМС »,« Эстрон, производное ТМС », « 16-эстрон, производное ТМС »,« Эстрон, O-метилоксим, производное ТМС », « Эквилин, производное ТМС »,« Эквиленин »(14.beta .) -, производное ТМС ", " Эквиленин, производное ТМС "," 2-Гидроксиэстрадиол, производное 3ТМС ", " Андростерон, (Е) -, производное ТМС "," Дегидроэпиандростерон, (Е) -, производное ТМС " «5-дегидротестостерон, производное ТМС», «5-Дегидротестостерон, производное ТМС», «Тестостерон O-метилоксим, производное ТМС», «Тестостерон, производное ТМС», «Прегенолон, производное ТМС» , «Aldosterone, производное 2TMS», «Альдостерон, N-метокситри-ТМС», «Кортикостерон, бис (O-метилоксим)», «Дезоксихолевая кислота, производное 2TMS», «Deoxyc холестерин, производное ТМС », « Десмостерол, производное ТМС »,« Эргостерол, производное ТМС », « Кампестерол, производное ТМС »,« Фукостерол, ТМС » производное », « Стигмастанол, производное ТМС »,« Стигмастерол, производное ТМС », « 11-Дезоксикортизол, бис (O-метилоксим) »,« Мелатонин, производное 2 ТМС », « Адреналин, производное 4 ТМС »,« L- Адреналин, производное 4ТМС », « Глицин, производное 3ТМС »,« Глицин, производное ТМС »,« Глицин, производное 2 ТМС », « Аспарагиновая кислота, производное 3ТМС »,« L-аспарагиновая кислота, производное 3 ТМС », « L -аспарагиновая кислота, производное 2TMS "," L-глутаминовая кислота, производное 3TMS ", " (-) - Адреналин, 3TMS deri («)», «Эпинефрин», «3», « » (-) - «Эпинефрин», «4TMS производное», «Норадреналин, (R) -, 5TMS производное», «DL-норэпинефрин, производное 4TMS», "норадреналин, (R) -, 4TMS производное", "циклосерин, 3TMS производное", "Циклогексимид, 2TMS производное", "хлорамфеникол, 2TMS производное", "Хлорамфеникол, 3TMS производное" )

Спасибо ,

ответ

1

После ваших правок я сделал следующим образом: Во-первых, извлечь формулировками с соответствующими суффиксами

parents <- extract_indices <- str_split(nist, ",") %>% 
    lapply(str_extract, "[A-z][a-z]+(ine|ol|in|ose|ic|one|ide)") 

Тогда, так как некоторые из этих слов было больше, чем один запятая в них, извлечь возникновение, не NA значения к списку extract_indices и сохранить индекс, который это происходило в каждом элементе списка к вектору indvec

extract_indices <- parents %>% 
    lapply(function(x) which(!is.na(x))) 
indvec <- do.call("c",extract_indices) 

Затем проведите цикл через родителей и для каждого элемента списка, извлеките вектор, который родительский компонент произошел.

answer <- sapply(seq_along(parents), 
     function(i){ 
     parents[[i]][indvec][i] 
     }) 

    answer 

    [1] "Formic"     "Acetic"     "Acetic"     "Propanoic"    "Butyric"    
    [6] "Pentanoic"    "Hexanoic"    "Heptanoic"    "Oxalic"     "Succinic"    
[11] "Adipic"     "Pimelic"    "Suberic"    "Citric"     "Citric"     
[16] "Citric"     "Citric"     "Isocitric"    "Glyoxylic"    "Pyruvic"    
[21] "Malic"     "Malic"     "Malic"     "Malic"     "Hydroxybutanoic"  
[26] "Prostaglandin"   "Prostaglandin"   "Prostaglandin"   "Arabinose"    "Xylose"     
[31] "Lyxose"     "Ribose"     "Glucose"    "Galactose"    "Mannose"    
[36] "Allose"     "Allose"     "Altrose"    "Dihydroxyacetone"  "Dihydroxyacetone"  
[41] "Fructose"    "Psicose"    "Sedoheptulose"   "Deoxyribose"   "Deoxyribose"   
[46] "Fucose"     "Rhamnose"    "Rhamnose"    "glucosamine"   "Gluconic"    
[51] "Glycerol"    "Glycerol"    "Glycerol"    "Xylitol"    "Sorbitol"    

Он по-прежнему, как это ...

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

nchar_parent <- nchar(nist) 
final <- vector(mode = "character", length(nist)) 
for(i in seq_along(nist)){ 
    temp_matches <- which(match(answer,answer[i])==TRUE) 
    shortest <- temp_matches[which.min(nchar_parent[temp_matches])] 
    final[i] <- nist[shortest] 
} 

Ваш окончательный ответ выглядит следующим образом

[1] "Formic acid, TMS derivative"     "Acetic acid, TMS derivative"     
    [3] "Acetic acid, TMS derivative"     "Propanoic acid, TMS derivative"    
    [5] "Butyric Acid, TMS derivative"     "Pentanoic acid, TMS derivative"    
    [7] "Hexanoic acid, TMS derivative"    "Heptanoic acid, TMS derivative"    
    [9] "Oxalic acid, 2TMS derivative"     "Succinic acid, monoethyl ester-, (TMS)"  
[11] "Adipic acid, TMS derivative"     "Pimelic acid, 2TMS derivative"    
[13] "Suberic acid, 2TMS derivative"    "Citric acid 3TMS"        
[15] "Citric acid 3TMS"        "Citric acid 3TMS"        
[17] "Citric acid 3TMS"        "Isocitric acid lactone, 2TMS derivative"  
[19] "Glyoxylic acid, di-TMS"      "Pyruvic acid, TMS derivative"     
[21] "Malic acid, 2TMS derivative"     "Malic acid, 2TMS derivative"     
[23] "Malic acid, 2TMS derivative"     "Malic acid, 2TMS derivative"  
+0

Это будет работать, если бы они были всеми простыми кислотами. Df был обновлен некоторыми другими значениями. также, мне нужно сохранить только простейшую версию, а не любую версию –

+0

любых других предложений? –

+0

Какие другие формы используют соединения? У вас есть список? Совпадение с известным списком будет легким, иначе это будет более резкое расщепление строк ad hoc. – shayaa

0

Если вам нужна только первая часть второго столбца (до запятой), вы можете использовать функцию split, разделив вторую колонку на множество столбцов; после этой операции вам понадобится первая колонка этого результата; после этого можно удалить дублированные записи df на основе вычисленного столбца; последняя инструкция удаляет (необязательно) первую часть второго столбца.

df$foo <- data.frame(do.call('rbind', strsplit(as.character(df$NAME),',',fixed=TRUE)))[,1]#split values 
df<-df[!duplicated(df$foo),] 
df<-df[,-3] 
+1

Конечно, мне очень жаль. Я новичок здесь –

+0

Этот формат удаляет все дубликаты и не сохраняет один из них, не так ли? –

+0

Если у вас есть: пиппо, пиппо, плутон, он останется только пиппо (первый) и плутоном –