2017-03-12 15 views
0

"Sample"に基づいて "Duplicate"列を生成したいと思います。 003はサンプルID、003rは同じサンプルのレプリケートです。 "Sample"列のレプリケートされたサンプル名は、最初の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文字にマッチすることだけです。単純に 'duplicated(substring(df $ Sample、1、3))| ( 'df $ Sample、1、3)、fromLast = TRUE)'となります。 –

+0

@DavidArenburgありがとう、これは私が探していたものであり、しばらくして私はそれがどのように動作するかも理解していました。 –

答えて

0

@David Arenburgが正しいとするには、まず「部分的に一致する」名前の意味を正式に定義する必要があります。位置1(スタート)と、試料中のあなたの部分文字列の3(停止)の間で完全に一致する(同一である)によって定義される部分一致と仮定すると、私たちはこの部分文字列を保持する新しい列を作成することができます

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 
関連する問題