

Rのデータフレームで、同じ行の次の列の値と自分の値を参照して、置換を行う  
簡単な方法  
を教えて欲しいです！

下記画像のような処理をしたいです  
(自分のマス==1&&同じ行の次の列のマス==0)を満たす場合、自分のマスを2に変更

[![if\(自分のマス==1&&同じ行の次の列のマス==0\)、自分のマスを2に変更\)](https://i.stack.imgur.com/mpZ7D.jpg)](https://i.stack.imgur.com/mpZ7D.jpg)


CC BY-SA 4.0
2020-04-30T08:54:56.437
66146
2020-06-24T02:54:22.263
2020-06-17T08:14:45.997
-1
39897
question
r
Rのデータフレームで、同じ行の次の列の値と自分の値を参照して、置換を行う関数を教えて欲しいです！


こんなのは思いついてる範囲かもしれませんが、…以降の条件もよくわからなかたので。

[code]

    # データフレームの作成
    df <- rbind(c(NA,NA,1,1,1),
                c(1,0,0,0,0),
                c(1,1,0,0,0),
                c(1,1,1,0,0),
                c(NA,NA,1,0,0))
    
    # 行数でループ
    for( i in 1:nrow(df)){
      # 列数でループ
      for( j in 1:(ncol(df) -1)){
        # 検証する要素のNA判定、NAを含まない場合でTRUE
        if(!is.na(df[i,j])){
          # dfの要素で1の次の列に0があるか判定
        if((df[i,j] == 1 ) && (df[i,(j+1)] == 0)){
          # TRUEなら1を2に書き換える
          df[i,j] <- 2
        }
        }
      }
    }
    
[/code]

NA要素を含んでいるので処理が煩雑です。  
要素の数だけでループで確認しているので、要素が増えるとその分処理が遅くなります。  
あまりエレガントではありませｎ。


CC BY-SA 4.0
2020-05-02T12:05:42.463
66216
2020-05-02T14:25:39.453
2020-05-02T14:25:39.453
39947
39947
66146
answer


いろんなやり方があると思うのですが、  
せっかくRなのでtidyverseを使ったやり方はいかがでしょう。

「書くコード量を減らす」を最優先に考えています。

[code]

    tibble <- rbind(c(NA,NA,1,1,1),
                c(1,0,0,0,0),
                c(1,1,0,0,0),
                c(1,1,1,0,0),
                c(NA,NA,1,0,0)) %>% as_tibble
    
    tibble %>%
      unite("combi", 1:ncol(tibble), sep="-") %>%
      mutate(modified = str_replace_all(combi, "1-0", "2-0"))
    
    
[/code]

このような結果になります：

[code]

    > tibble %>%
    +   unite("combi", 1:ncol(tibble), sep="-") %>%
    +   mutate(modified = str_replace_all(combi, "1-0", "2-0") )
    # A tibble: 5 x 2
      combi       modified   
      <chr>       <chr>      
    1 NA-NA-1-1-1 NA-NA-1-1-1
    2 1-0-0-0-0   2-0-0-0-0  
    3 1-1-0-0-0   1-2-0-0-0  
    4 1-1-1-0-0   1-1-2-0-0  
    5 NA-NA-1-0-0 NA-NA-2-0-0
    
[/code]

後は必要に合わせて separate() など使って整形すれば元に戻すことも一行で可能です。

[code]

    > colnames_bkp <- names(tibble)
    > 
    > tibble %>%
    +   unite("combi", 1:ncol(tibble), sep="-") %>%
    +   mutate(modified = str_replace_all(combi, "1-0", "2-0")) %>%
    +   separate("modified", into = colnames_bkp)
    # A tibble: 5 x 6
      combi       V1    V2    V3    V4    V5   
      <chr>       <chr> <chr> <chr> <chr> <chr>
    1 NA-NA-1-1-1 NA    NA    1     1     1    
    2 1-0-0-0-0   2     0     0     0     0    
    3 1-1-0-0-0   1     2     0     0     0    
    4 1-1-1-0-0   1     1     2     0     0    
    5 NA-NA-1-0-0 NA    NA    2     0     0    
    
[/code]

"unite()/separate()"の組み合わせは本当にいろんな使い方が出来るので、  
色々楽しんでみてくださいね。


CC BY-SA 4.0
2020-06-24T02:54:22.263
67939
2020-06-24T02:54:22.263
32676
66146
answer