2017-07-19 4 views
2

に基づいて、Rの行の値を交換することは私のデータフレームがdf前の行の下

df <- data.frame(A=c(1,1,1,1,0,0,-1,-1,-1,1,1,1,1)) 

である私はそれがいずれかによってAの値の変化を検出したときに最初の値を維持する別の変数T_Dしたいと思います1または-10

予想される出力で次の行を置き換えます。

A T_D 
1 1 
1 0 
1 0 
1 0 
0 0 
0 0 
-1 -1 
-1 0 
-1 0 
1 1 
1 0 
1 0 
1 0 

答えて

0

ベースのR・ソリューションは、これはあなたのために働くようだ:

df$T_D = df$A*!c(FALSE,diff(df$A,lag=1)==0), 

は、順次行の違いを見つけます。差が1である場合は、それ以外の場合は0

OUTPUT

A T_D 
1 1 1 
2 1 0 
3 1 0 
4 1 0 
5 0 0 
6 0 0 
7 -1 -1 
8 -1 0 
9 -1 0 
10 1 1 
11 1 0 
12 1 0 
13 1 0 
1

dplyrwindow functionsに設定され、列Aからエントリを取る、これは簡単になります。 lag関数を使用して前の値を調べ、現在の値と等しいかどうかを確認することができます。テーブルの最初の行には前の値がないため、T_Dは常にNAになります。幸いにもその行は常にaと等しくなりますので、2番目の突然変異(またはdf[1,2] <- df[1,1])で修正するのは簡単な問題です。

library(tidyverse) # Loads dplyr and other useful packages 

df <- tibble(a = c(1, 1, 1, 1, 0, 0, -1, -1, -1, 1, 1, 1, 1)) 

df %>% 
    mutate(T_D = ifelse(a == lag(a), 0, a)) %>% 
    mutate(T_D = ifelse(is.na(T_D), a, T_D)) 
+0

グッドキャッチ、@docendodiscimus!私はちょうど私の答えを修正した。 –

1
df$T_D <- sign(abs(df$A)*diff(c(0, df$A))) 
+0

これは要求された出力OPを返しません。 – Florian

+0

これは役に立ちます。それは素晴らしい解決策です! – Florian

+0

これでOKですが、df $ T_D < - sign(abs(df $ A)* diff(c(0、df $ A)))という追加用語を追加する必要がありました。 –

1

data.tableアプローチは次のようになり、

library(data.table) 
setDT(df)[, T_D := replace(A, duplicated(A), 0), by = rleid(A)][] 

#  A T_D 
# 1: 1 1 
# 2: 1 0 
# 3: 1 0 
# 4: 1 0 
# 5: 0 0 
# 6: 0 0 
# 7: -1 -1 
# 8: -1 0 
# 9: -1 0 
#10: 1 1 
#11: 1 0 
#12: 1 0 
#13: 1 0 
関連する問題