2017-03-12 31 views
0

我想根據「示例」生成「重複」列。 003是樣品ID,003r是同一樣品的複製品。 「樣品」列中的複製樣品名稱在前3個字符中相同。R - 識別部分字符串匹配的其餘部分或找到列中的部分重複項

Sample <- c("001","002","003","003r","004","005","005r") 
Value <- c(2,5,4,4,5,6,7) 
Duplicate <- c(F,F,T,T,F,T,T) 
df <- data.frame(Sample,Value,Duplicate) 
df 

    Sample Value Duplicate 
1 001  2  FALSE 
2 002  5  FALSE 
3 003  4  TRUE 
4 003r  4  TRUE 
5 004  5  FALSE 
6 005  6  TRUE 
7 005r  7  TRUE 

我與ifelsegrep嘗試,但不能在這給了我想要的結果的方式將它們組合,和我被堵在這一點上。 我將不勝感激,謝謝。

+0

你能否多說一點數據:它是否總是你感興趣的前3個字符?你想檢查重複的部分是否總是數字和變化字符? – JonGrub

+1

你可以試試'stringdist :: stringdistmatrix(df $ Sample)',但不清楚爲什麼'003r'和'003'是愚蠢的,但不是'001'和'002'-兩對都有一個字符距離。如果你正在尋找的是匹配前3個字符,你可以簡單的做'duplicate(substring(df $ Sample,1,3))|重複(substring(df $ Sample,1,3),fromLast = TRUE)'這會給你想要的輸出。 –

+0

@DavidArenburg非常感謝,這就是我一直在尋找的東西,過了一段時間我也明白它是如何工作的。 –

回答

0

@David Arenburg是對的,你需要首先正式定義「部分匹配」名稱的含義。假設部分匹配是通過(是相同的)完美匹配的子串的位置1(啓動)和3(停止)之間在樣品的定義,我們可以建立一個新列保持此substring:

df$sample_substr <- substr(df$Sample,start = 1,stop = 3) 

...和然後簡單計數每個sample_substr的出現次數(頻率)。我建議使用'plyr'軟件包(它非常快):

library(plyr) 
# group by 'sample_substr' and count the number of occurrences 
df <- ddply(df, .(sample_substr), mutate, frequency=length(sample_substr)) 
# if frequency is 1, it is unique, i.e. not a duplicate. If frequency is > 1, it is not unique, i.e. a duplicate. 
df$Dup <- ifelse(df$frequency==1, FALSE, TRUE) 
# test if our definition of Dup holds the same value as yours in Duplicate 
df$Dup==df$Duplicate