2016-04-08 4 views
0

2つの列を持つデータフレーム、2番目のデータフレームの行をインデックスするインデックス列があります。これらの行にはすべて特定のイベントが含まれています。このイベントは、2番目の列にコード化されています。ここにはcode_start_stopという名前が付けられています。Rデータフレームをきれいにする方法

例:

index <- c(769, 766, 810, 813, 830, 842, 842, 892, 907, 944) 
code_start_stop <- c(2006, 2001, 2004, 1001, 1004, 2001, 1001, 1006, 2004, 1004) 
replace_all <- data.frame(index, code_start_stop) 

今すぐスタートの組がある/ストップコード、すなわち2001年と1001年、2002年と1002年、など目的は、がケースにで囲まれている行がある、ということです開始マーカー(すなわちここでは2006)およびそれぞれの次の停止マーカー(ここでは1006)の場合、これらの行はデータフレームから削除する必要があります。 開始記号のペアは常に開始記号&であることに注意してください。

これを行うには巧妙な方法の提案がありがたいです。ありがとう!

+0

'インデックスを削除'と' code_start_stop'の長さが異なるので、 'replace_all'を現在のコードで作成することはできません。 – alistaire

答えて

0

あなたの質問はちょっと混乱しています。私が間違っていると私を修正してください。 次は動作するはずです:

startm <- 2006 #startmarker 
endm <- 1006 #endmarker 

#look for row that contains markers 
index1 <- which(replace_all[,2] == startm) 
index2 <- which(replace_all[,2] == endm) 

#subset accordingly 
replace_all <- replace_all[-(index1:index2),] 

注:これはまた、行を削除し、マーカーを含みます。マーク間の行のみを削除したい場合は、サブセットステップでa + 1/-1を追加します。

+0

ありがとう!しかし、私は最初に開始マーカーと終了マーカーのペアを持っています: 'startm1 < - 2001 endm1 < - 1001 .... startm6 < - 2006 endm6 < - 1006' また、 (これは上記の例よりもはるかに大きくなります)。 –

+0

あなたは単にそれらのペアをループすることができます – maRtin

0

解決策は現在、maRtinの提案に基づいており、かなりうまくいくようです。

私は次のように開始と終了マーカーのすべてのペアを介さん:

to_delete <- c() 
## Care = 2001/1001 
startm1 <- 2001 
endm1 <- 1001 
index1 <- which((replace_all[,2] == startm1)) 
index2 <- which((replace_all[,2] == endm1)) 
if(length(index1) !=0){ 
    for (i in 1:length(index1)){ 
    if (index2[i]-index1[i]>1){ 
     to_delete <- c(to_delete, (((index1[i])+1):((index2[i])-1))) 
    } 
    } 
} 

が...開始の他のすべてのペアを通過/マーカーを停止してからto_delete

if (length(to_delete) != 0){ 
    replace_all <- replace_all[-to_delete,] 
    } 
    replace_all <- replace_all[,1] 
    } 
関連する問題