0

私はマトリックスを持っています:

1 3  NA
1 2  0
1 7  2
1 5  NA
1 9 5
1 6  3
2 5  2
2 6  1
3 NA  4
4 2  9
...

最初の列の各数値に対して、2 番目の列の対応する値が独自の 2 番目の列に NA を持つ要素を選択したいと思います。

したがって、検索は次のようになります。

  1. 最初の列の番号を検索: 1.
  2. 2 列目の対応する値を確認してください: 3,2,7,5,9,6...
  3. 最初の列で 3,2,7,5,9,6 を検索し、2 番目の列に NA があるかどうかを確認します

上記の場合の結果は次のようになります。

>3 NA  4<

これは、独自の 2 行目に NA を持つ唯一の値であるためです。

やりたいことを言葉にすると以下のようになります。

  1. 1 列目の数字を見ると、「1」が見つかります。

  2. 1 の 2 列目にある数字: 3,2,7,5,9,6

  3. これらの数値の 2 番目の列には NA がありますか? はい、3 には NA があります

  4. 行番号ではなく、これらの番号を返したいと思います。

  5. 結果は、条件を満たす行を含む元の行列のサブセットになります。

これは、i が列 1 の数値である matlab と同等です。

isnan(matrix(matrix(:,1)==i,2))==1) 
4

3 に答える 3

2

を使用して、データフレームであるbyと仮定して、列1のグループごとに結果を取得しますdat

by(dat,dat$V1,FUN=function(x){
                  y <- dat[which(dat$V1 %in% x$V2),]
                  y[is.na(y$V2),]
})

dat$V1: 1
  V1 V2 V3
9  3 NA  4
-------------------------------------------------------------------------------- 
dat$V1: 2
[1] V1 V2 V3
<0 rows> (or 0-length row.names)
-------------------------------------------------------------------------------- 
dat$V1: 3
[1] V1 V2 V3
<0 rows> (or 0-length row.names)
-------------------------------------------------------------------------------- 
dat$V1: 4
[1] V1 V2 V3
<0 rows> (or 0-length row.names)

編集

ここでは、matlab コマンドと同じ機能を実行しようとしています。

ここでは、matlab に相当する R

  isnan(matrix(matrix(:,1)==i,2))==1)   ## what is i here 

  is.na(dat[dat[dat[,1]==1,2],])        ## R equivalent , I set i =1

     V1    V2    V3
3 FALSE FALSE FALSE
2 FALSE FALSE FALSE
7 FALSE FALSE FALSE
5 FALSE FALSE FALSE
9 FALSE  TRUE FALSE
6 FALSE FALSE FALSE
于 2013-01-19T16:53:54.847 に答える
2

これは、説明した手順に従っているため、簡単に読めることを願っています。

idx1 <- m[, 1L] == 1L
idx2 <- m[, 1L] %in% m[idx1, 2L]
idx3 <- idx2 & is.na(m[, 2L])
m[idx3, ]
# V1 V2 V3 
#  3 NA  4

これはすべてベクトル化され、整数比較を使用するため、極端に遅くなることはありません。ただし、ニーズに対して遅すぎる場合は、 adata.tableを使用し、最初の列をキーとして使用する必要があります。

割り当ては必要ないことに注意してください。したがって、ワンライナーを探している場合は、次のようになります。

m[is.na(m[, 2L]) & m[, 1L] %in% m[m[, 1L] == 1L, 2L], ]
# [1]  3 NA  4

(しかし、読みやすく維持するのは間違いなく困難です。)

于 2013-01-19T17:42:07.610 に答える
0

私はまだあなたが何を望んでいるのか完全にははっきりしていませんが、多分これはうまくいくでしょうか?

m<-read.table(
textConnection("1 3  NA
1 2  0
1 7  2
1 5  NA
1 9 5
1 6  3
2 5  2
2 6  1
3 NA  4
4 2  9"))

do.call(rbind,lapply(split(m[,2],m[,1]),function(x) m[x[!is.na(x)][is.na(m[x[!is.na(x)],2])],]))

#   V1 V2 V3
# 1  3 NA  4

複数の行が必要な例を提供すると、はるかに便利です。

于 2013-01-19T16:47:07.873 に答える