7

2 つのデータ フレームがあるとします。

 C1<-c(3,4,4,4,5)
 C2<-c(3,7,3,4,5)
 C3<-c(5,6,3,7,4)
 DF<-data.frame(C1=C1,C2=C2,C3=C3)
 DF
   C1 C2 C3
1  3  3  5
2  4  7  6
3  4  3  3
4  4  4  7
5  5  5  4

V1<-c(3,2,2,4,5)
V2<-c(3,7,3,5,2)
V3<-c(5,2,5,7,5)
V4<-c(1,1,2,3,4)
V5<-c(1,2,6,7,5)
DF2<-data.frame(V1=V1,V2=V2,V3=V3,V4=V4,V5=V5)
DF2
  V1 V2 V3 V4 V5
1  3  3  5  1  1
2  2  7  2  1  2
3  2  3  5  2  6
4  4  5  7  3  7
5  5  2  5  4  5

両方のデータ フレームの同等の各行を見ると、C3 の値と、DF2 の同じ行にドロップする列の数の間に関係があります。

C3 の値と DF2 のドロップする列数の関係は次のようになります。

If C3≥7 drop V5
If C3=6.0:6.9 drop V4 and up (so basically V5,V4)
If C3=5.0:5.9 drop V3 and up (so basically V5,V4,V3)
If C3=4.0:4.9 drop V2 and up (so basically V5,V4,V3,V2)
If C3≤3.9 drop entire row

この例では、C3 の値に基づいて、DF2 を次のようにします。

  V1 V2 V3 V4 V5
1  3  3
2  2  7  2

4  4  5  7  3 
5  5

これを行うための簡単なスクリプトを書いてみました (私はかなり新しいので、何が起こっているかを確認できるように物事を単純にしておくのが好きです) が、左右にエラーを投げているので、方法についてアドバイスをいただければ幸いです。続行します

4

3 に答える 3

4

Koshkeの答えは好きですが、設定のルールにNA優れた数学的特性がない場合、またはルールを任意に定義する必要がある場合は、このアプローチで柔軟性が得られるはずです。まず、ルールに基づいてドロップする列を返す関数を定義します。

f <- function(x) {
  if(x >= 7){
    out <- 5
  }else if(x >= 6.0){
           out <- 4:5
  } else if( x >= 5.0){
    out <- 3:5
  } else if (x >= 4.0){
    out <- 2:5
  } else {
    out <- 1:5
  }
  return(out)
}

次に、削除する列インデックスのリストを作成します。

z <- lapply(DF$C3, f)

最後に、各行をループして、対応する列をNAに設定します。

for(j in seq(length(z))){
  DF2[j, z[[j]]] <- NA
}

#-----
  V1 V2 V3 V4 V5
1  3  3 NA NA NA
2  2  7  2 NA NA
3 NA NA NA NA NA
4  4  5  7  3 NA
5  5 NA NA NA NA
于 2012-06-15T03:54:34.897 に答える
4

おそらく最も簡単な方法は次のようなものです:

DF3 <- DF2
for (i in seq_len(nrow(DF3))) {
  DF3[i, seq_len(ncol(DF3)) >= DF[i, ]$C3 - 2] <- NA
}
DF3

それから、

> DF3
  V1 V2 V3 V4 V5
1  3  3 NA NA NA
2  2  7  2 NA NA
3 NA NA NA NA NA
4  4  5  7  3 NA
5  5 NA NA NA NA
于 2012-06-15T03:46:00.037 に答える
2

定義されたカットポイントを使用したkohskeの答えのわずかなバリエーション:

breaksx <- cut(DF$C3,c(0,3,4,5,6,7,Inf),labels=FALSE)
for (i in seq(nrow(DF2))) {
        DF2[i,breaksx[i]:ncol(DF2)] <- NA
}

結果:

> DF2
  V1 V2 V3 V4 V5
1  3  3 NA NA NA
2  2  7  2 NA NA
3 NA NA NA NA NA
4  4  5  7  3 NA
5  5 NA NA NA NA

すべて NA である行を削除するには

DF2[apply(DF2,1,function(x) !all(is.na(x))),]

結果:

  V1 V2 V3 V4 V5
1  3  3 NA NA NA
2  2  7  2 NA NA
4  4  5  7  3 NA
5  5 NA NA NA NA
于 2012-06-15T04:26:57.300 に答える