38299

[code]

    >list_A.txt
    ID_1    1.00    8.00
    ID_5    3.00    5.00
    ID_8    2.00    0.00
    >list_B.txt
    ID_1    1.00    8.00
    ID_3    3.00    5.00
    ID_8    2.00    1.00
    ID_9    5.00    2.00
    >list_C.txt
    ID_2    1.00    8.00
    ID_3    3.00    5.00
    ID_8    3.00    0.00
    
[/code]

上記のようなリストから、全てに共通するもの（ID_8）のみを取り出したいです。

[code]

    >list_A.txt
    ID_8    2.00    0.00
    >list_B.txt
    ID_8    2.00    1.00
    >list_C.txt
    ID_8    3.00    0.00
    
[/code]

これまでは、Rのvenn関数でベン図を書き、A[A[,1] %in%
C[,1]]でAとCに共通なIDを取り出し、そのIDを元にコマンドラインでjoinしていました。  
しかし、この方法だとあまりにも煩雑なので、pythonもしくはRを使用し一括処理したいと思うのですが、方法が全く思いつきません。

なにかアドバイスをいただけませんでしょうか。よろしくお願いします。


CC BY-SA 3.0
2017-09-29T08:03:49.120
38289
2017-09-30T04:44:23.813
22885
question
python r
ベン図を書いた時のAかつBかつCとなる行のみを抽出したい


セット型を使えば良いかと思います。

[code]

    a = [("ID10",10,20),("ID20",30,40),("ID30",50,60)]
    b = [("ID11",11,21),("ID21",31,41),("ID30",51,61)]
    c = [("ID12",12,22),("ID22",32,42),("ID30",52,62)]
    
    #先頭行(ID)を抽出
    for i in a:
        a1.append(i[0])    
    for i in b:
        b1.append(i[0])
    for i in c:
        c1.append(i[0])
    
    #先頭行(ID)をset型に変更
    a1_set = set(a1)
    b1_set = set(b1)
    c1_set = set(c1)
    
    #共通のIDを抽出
    comID = a1_set & b1_set & c1_set
    
    #共通のIDのデータを抽出
    for ID in comID:
        for i in a:
            if ID == i[0]:
                print(i)
        for i in b:
            if ID == i[0]:
                print(i)
        for i in c:
            if ID == i[0]:
                print(i)
    
[/code]

結果は以下です。

[code]

    ('ID30', 50, 60)
    ('ID30', 51, 61)
    ('ID30', 52, 62)
    
[/code]


CC BY-SA 3.0
2017-09-29T08:58:04.183
38290
2017-09-29T08:58:04.183
23008
38289
answer


Rでの例です。

[code]

    ### データ作成
    library(tidyverse)
    
    list_A <-
      data.frame(id = c("ID_1", "ID_5", "ID_8"),
                 value1 = c(1, 3, 2), value2 = c(8, 5, 0), file = "A")
    list_B <-
      data.frame(id = c("ID_1", "ID_3", "ID_8", "ID_9"),
                 value1 = c(1, 3, 2, 5), value2 = c(8, 5, 1, 2), file = "B")
    list_C <-
      data.frame(id = c("ID_2", "ID_3", "ID_8"),
                 value1 = c(1, 3, 3), value2 = c(8, 5, 0), file = "C")
    
    input <- list(list_A, list_B, list_C)
    input <- lapply(file_paths, function(path) mutate(read_csv(path), file = path)) # ファイルパスから一括読み込みする
    
    ### 処理
    selected <- Reduce(intersect, map(input, "id"))
    filter(bind_rows(input), id %in% selected)
    
    ### 結果
    # 　　 id value1 value2 file
    # 1 ID_8      2      0    A
    # 2 ID_8      2      1    B
    # 3 ID_8      3      0    C
    
[/code]


CC BY-SA 3.0
2017-09-29T11:18:19.843
38299
2017-09-30T04:44:23.813
2017-09-30T04:44:23.813
19075
19075
38289
answer