2017-06-20 6 views
0

上のセルに1と同じである場合、私は、次のDFを持っている:R - テスト値が

name color 
A  red 
B  red 
C  green 
D  red 
E  red 
F  red 

そして、私は彼らがしているかどうかを確認するために「色」列の値をテストしたいです私を与えるために

> df$same <- ifelse(df$color == df$color[c(NA,1:(nrow(df)-1))], 1, 0) 

を::上記の行の値と同じと新しい列への書き込み...私はそう、次を使用して行うことができ

name color same 
A  red  NA 
B  red  1 
C  green  0 
D  red  0 
E  red  1 
F  red  1 

をしかしそこにありますそれを行うクリーナーの方法? (私はこれを常時使用しています)...

+1

おそらくクリーナーではないが、ここでの代替です: 'as.integer(C(NA、差分(as.integer(DATは、 $ color))== 0)) '。 – lmo

答えて

1

dplyrパッケージから機能を試すことができます。あなたはmagrittrパッケージからパイプ演算子を使用することができ、上記の行の値を持つ新しい列を作成し、それらを比較した後、

> dt$color_above <- lag(dt$color, n=1) 

> dt 

    name color color_above 
1 A red  <NA> 
2 B red   red 
3 C green   red 
4 D red  green 
5 E red   red 
6 F red   red 

を直接問題を解決することができます。それはまだ冗長ですが、私はそれがコードをより明確に保つと思います。

ラファエルの答えに追加
> dt %$% 
    { color == lag(color, n=1) } %>% 
    as.numeric() %>% 
    {.} -> dt$same 

> dt 

    name color same 
1 A red NA 
2 B red 1 
3 C green 0 
4 D red 0 
5 E red 1 
6 F red 1 
0

、あなたはdplyr::mutateifelseを使用することができます。

> dt <- data_frame(name = c('A', 'B', 'C', 'D', 'E', 'F'), color = c('red', 'red', 'green', 'red', 'red', 'red')) 
> dt 
# A tibble: 6 x 2 
    name color 
    <chr> <chr> 
1  A red 
2  B red 
3  C green 
4  D red 
5  E red 
6  F red 
> dt %>% mutate(same = ifelse(color == lag(color), 1, 0)) 
# A tibble: 6 x 3 
    name color same 
    <chr> <chr> <dbl> 
1  A red NA 
2  B red  1 
3  C green  0 
4  D red  0 
5  E red  1 
6  F red  1