2016-12-11 11 views
0

私はマージとカウント類似文字列

Inputdf<-structure(list(df1 = structure(c(4L, 5L, 2L, 1L, 3L), .Label = c("P61160,P61158,O15143,O15144,O15145,P59998,O15511", 
"P78537,Q6QNY1,Q6QNY0", "Q06323,Q9UL46", "Q92793,Q09472,Q9Y6Q9,Q92831", 
"Q92828,Q13227,O15379,O75376,O60907,Q9BZK7"), class = "factor"), 
    df2 = structure(c(3L, 2L, 5L, 4L, 1L), .Label = c("", "P61158,O15143,O15144", 
    "Q06323,Q9UL46", "Q6QNY0", "Q92828"), class = "factor"), 
    df3 = structure(c(5L, 4L, 3L, 2L, 1L), .Label = c("", "O15511", 
    "Q06323,Q9UL46", "Q6QNY0", "Q92793,Q09472"), class = "factor")), .Names = c("df1", 
"df2", "df3"), class = "data.frame", row.names = c(NA, -5L)) 

私は

df1例については、このデータで同様の文字列を検索しようとしていますのような3列のデータを持って、私はQ92793,Q09472,Q9Y6Q9,Q92831を持っている最初の行を持っています はその後、私はDF2およびDF3を見て、これらのメンバーのいずれかがそこにあるかどうかを確認し、この例では、私は次のようなデータを作る

df1 df2 df3 Numberdf1  df2  df3 
1 0 1 4    0  Q92793,Q09472 

df1 1はdf1の最初の行を意味します df2 0は類似性を持たないことを意味します df3 1はdf3の最初の行がdf1行1と類似していることを意味します Numberdf1、,で区切られた文字列の数です。 DF3がここ

以下の機能がありません

out<- structure(list(df1 = 1:5, df2 = c(0L, 3L, 4L, 2L, 1L), df3 = c(1L, 
0L, 2L, 4L, 3L), Numberdf1 = c(4L, 6L, 2L, 7L, 2L), df2.1 = structure(c(1L, 
5L, 4L, 2L, 3L), .Label = c("0", "P61158,O15143,O15144", "Q06323,Q9UL46", 
"Q6QNY0", "Q92828"), class = "factor"), df3.1 = structure(c(5L, 
1L, 4L, 2L, 3L), .Label = c("0", "O15511", "Q06323,Q9UL46", "Q6QNY0", 
"Q92793,Q09472"), class = "factor")), .Names = c("df1", "df2", 
"df3", "Numberdf1", "df2.1", "df3.1"), class = "data.frame", row.names = c(NA, 
-5L)) 

以下のような欲求の出力が見えるに類似していた文字列を貼り付けQ92793、Q09472あるDF2どのような文字列のアコードがなかったので、4 DF2は0でありますたとえば、このデータを入力として使用しないでください

Inputdf1<- structure(list(df1 = structure(c(2L, 3L, 1L), .Label = c("Q06323,Q9UL46", 
"Q92793,Q09472,Q9Y6Q9,Q92831", "Q92828,Q13227,O15379,O75376,O60907,Q9BZK7" 
), class = "factor"), df2 = structure(1:3, .Label = c("P25788,P25789", 
"Q92828, O60907, O75376", "Q9UL46, Q06323"), class = "factor"), 
    df3 = structure(c(2L, 1L, 3L), .Label = c("Q92831, Q92793, Q09472", 
    "Q9BZK7, Q92828, O75376, O60907", "Q9UL46, Q06323"), class = "factor")), .Names = c("df1", 
"df2", "df3"), class = "data.frame", row.names = c(NA, -3L)) 
+0

を占め

EDIT

バージョンは 'out'をチェックしてもらえますか?これらの値は正しいですか? 2行目の 'out'では、' df2'の値が 'P61158、O15143、O15144'で最後の行の場合と同様にdf2.1を' Q92828'としました – akrun

+0

@akrun df1の行が重要ですdf2の2行目または3行目または10行目と似ている可能性があります。その場合、df1の2番目の行にはdf2の3番目の行に同様の文字列があります。それは今明らかですか? – nik

答えて

1

これはあなたの例のために働く:

# First convert factors to strings to lists 
Inputdf[] = lapply(Inputdf, as.character) 
Inputdf[] = lapply(Inputdf, function(col) sapply(col, function(x) unlist(strsplit(x,',')))) 

not.empty = function(x) length(x) > 0 
out = data.frame() 

for (r in 1:nrow(Inputdf)) { 
    df2.intersect = lapply(Inputdf$df2, intersect, Inputdf$df1[[r]]) 
    df3.intersect = lapply(Inputdf$df3, intersect, Inputdf$df1[[r]]) 

    out[r, 'df1'] = r 
    out[r, 'df2'] = Position(not.empty, df2.intersect, nomatch=0) 
    out[r, 'df3'] = Position(not.empty, df3.intersect, nomatch=0) 
    out[r, 'Numberdf1'] = length(Inputdf$df1[[r]]) 
    out[r, 'df2.1'] = paste(Find(not.empty, df2.intersect, nomatch=0), collapse=',') 
    out[r, 'df3.1'] = paste(Find(not.empty, df3.intersect, nomatch=0), collapse=',') 
} 

out 
# df1 df2 df3 Numberdf1    df2.1   df3.1 
# 1 1 0 1   4     0 Q92793,Q09472 
# 2 2 3 0   6    Q92828    0 
# 3 3 4 2   3    Q6QNY0  Q6QNY0 
# 4 4 2 4   7 P61158,O15143,O15144  O15511 
# 5 5 1 3   2  Q06323,Q9UL46 Q06323,Q9UL46 

注:FindPositionのみ最初の一致を確認します。一致する可能性のあるものが複数ある場合は、whichを使用します。複数の一致

Inputdf[] = lapply(Inputdf, as.character) 
Inputdf[] = lapply(Inputdf, function(col) sapply(col, function(x) unlist(strsplit(x,',\\s*')))) 

not.empty = function(x) length(x) > 0 
out = data.frame() 

for (r in 1:nrow(Inputdf)) { 
    df2.intersect = lapply(Inputdf$df2, intersect, Inputdf$df1[[r]]) 
    df3.intersect = lapply(Inputdf$df3, intersect, Inputdf$df1[[r]]) 

    out[r, 'df1'] = r 
    out[r, 'df2'] = paste(which(sapply(df2.intersect, not.empty)), collapse=',') 
    out[r, 'df3'] = paste(which(sapply(df3.intersect, not.empty)), collapse=',') 
    out[r, 'Numberdf1'] = length(Inputdf$df1[[r]]) 
    out[r, 'df2.1'] = paste(unique(unlist(df2.intersect)), collapse=',') 
    out[r, 'df3.1'] = paste(unique(unlist(df3.intersect)), collapse=',') 
} 

out[out==""] = "0" 
+0

複数の類似点があるので、実際のデータでは正しい回答が得られないので、その方法に変更することは可能でしょうか – nik

+0

私はそれがうまくいかないことを示す別の例を掲載しました!私は問題がどこにあるのかわかりません – nik

+0

@nik新しい例では、項目を分離する余分なスペースがあります( "A、B"対 "A、B") – sirallen

関連する問題