5275


表１と表２を比較して、Rかshで差がある部分がどこなのかを出力したく存じます。

表1.csv  
（10行*300列くらい）

[code]

    1,2,3,4,5,・・・
    6,7,8,9,0,
    1,2,3,4,5,
    6,7,8,9,0,
    1,2,3,4,5,
    6,7,8,9,0,
    .
    .
    .
    
[/code]

表2.csv

[code]

    1,2,3,4,5,・・・
    6,7,8,9,0,
    1,2,3,4,5,
    1,7,8,9,0,
    1,2,3,4,5,
    1,7,8,9,0,
    .
    .
    .
    
[/code]

比較表.csv

表１と表２を比較して、差があった部分だけ1を立てます。

[code]

    0,0,0,0,0,
    0,0,0,0,0,
    0,0,0,0,0,
    1,0,0,0,0,
    0,0,0,0,0,
    1,0,0,0,0,
    
[/code]

Rの場合ですと

Rのスクリプトを起動して

[code]

    #!/bin/bash
    r --vanilla --slave < disff.R
    
[/code]

disff.Rで

[code]

    a <- read.csv("表1.csv")
    b <- read.csv("表2.csv")
    a - b
    
[/code]

で引き算はできるのですが、そのあと差分がある部分の抽出方法がわかりません。


CC BY-SA 3.0
2015-01-24T14:21:25.713
5218
2015-01-26T13:50:38.977
2015-01-26T04:21:37.270
7590
7590
question
r sh
表１と表２を比較して、差がある部分がどこなのか表を出力したい。


bash で書いてみました(エラーチェックは省いてあります)。

[code]

    #!/bin/bash
    
    data1="$1"
    data2="$2"
    
    num=$(head -1 "$data1" | grep -Eo ',' | wc -l)
    eval $(eval "
      echo -n 'paste -d, '
      for ((i=1;i<=(num+1);i++))
      do
        echo -n \"
          <(paste -d' '
              <(cut -d, \"${data1}\" -f\$i)
              <(cut -d, \"${data2}\" -f\$i) |
            awk '{print (\\\$1-\\\$2)?1:0}') \"
      done
    ")
    
[/code]

これを `cmp_csv.sh` として保存します。実行方法は以下となります。

[code]

    $ ./cmp_csv.sh data1.csv data2.csv
    
[/code]

前提条件は、

  * data1.csv と data2.csv の列数・行数が同じ
  * データは全て数値

です。


CC BY-SA 3.0
2015-01-24T16:13:15.443
5222
2015-01-24T16:29:49.007
2015-01-24T16:29:49.007
5218
answer


Rで書く方法を回答します。  
data.frame 同士を引き算すれば同じ値のところはゼロになります。

[code]

    df1 <- read.csv("表1.csv", header = FALSE)
    df2 <- read.csv("表2.csv", header = FALSE)
    
    df1 - df2
    #>   V1 V2 V3 V4 V5
    #> 1  0  0  0  0  0
    #> 2  0  0  0  0  0
    #> 3  0  0  0  0  0
    #> 4  5  0  0  0  0
    #> 5  0  0  0  0  0
    #> 6  5  0  0  0  0
    
[/code]

ifelseで値がゼロかゼロでないかで場合分けをすると、以下のように書けます。  
こちらでご期待の回答になっているでしょうか？

[code]

    ifelse((df1 - df2) != 0, 1, 0)
    #>      V1 V2 V3 V4 V5
    #> [1,]  0  0  0  0  0
    #> [2,]  0  0  0  0  0
    #> [3,]  0  0  0  0  0
    #> [4,]  1  0  0  0  0
    #> [5,]  0  0  0  0  0
    #> [6,]  1  0  0  0  0
    
[/code]


CC BY-SA 3.0
2015-01-25T23:38:37.710
5275
2015-01-26T13:50:38.977
2015-01-26T13:50:38.977
2544
2544
5218
answer