5

日付フレームの各行について、この行の値を更新する必要がある列インデックスを示すベクトルがあります。

> set.seed(12008); n <- 10000; d <- data.frame(c1=1:n, c2=2*(1:n), c3=3*(1:n))
> i <- sample.int(3, n, replace=TRUE)
> head(d); head(i)
  c1 c2 c3
1  1  2  3
2  2  4  6
3  3  6  9
4  4  8 12
5  5 10 15
6  6 12 18
[1] 3 2 2 3 2 1

これは、行1と4について、c3を更新する必要があることを意味します。行2、3、および5については、c2を更新する必要があります(とりわけ)。ベクトル化された演算を使用して、つまり、apply友達なしでRでこれを達成するための最もクリーンな方法は何ですか?編集:そして、可能であれば、Rループなしで?

d行列に変換してから、1次元ベクトルを使用して行列要素に対処することを考えました。しかし、行と列のインデックスから1次元アドレスを計算するためのクリーンな方法が見つかりませんでした。

4

3 に答える 3

4

サンプルデータを使用し、最初の数行 (DおよびI以下) のみを使用すると、推測どおり、マトリックスを介して簡単に実行できます。

set.seed(12008)
n <- 10000
d <- data.frame(c1=1:n, c2=2*(1:n), c3=3*(1:n))
i <- sample.int(3, n, replace=TRUE)
## just work with small subset
D <- head(d)
I <- head(i)

まず、D行列に変換します。

dmat <- data.matrix(D)

次に、 で示される行と列に対応する行列のベクトル表現のインデックスを計算しますI。このため、この単純な例では vectorを使用して、行インデックスと列インデックス ( で指定I) を簡単に生成できます。ベクトル インデックスを計算するには、以下を使用できます。seq_along(I)1:6

(I - 1) * nrow(D) + seq_along(I)

ここで、最初の部分 ( (I - 1) * nrow(D)) は、行数 (ここでは 6) の正しい倍数を示し、Ith 列の開始にインデックスを付けます。次に、行インデックスを追加して、th 列の n 番目の要素のインデックスを取得しIます。

dmatこれを使用して、 usingにインデックスを付け"["、ベクトルのように扱います。"["( )の置換バージョンを"[<-"使用すると、1 行で置換を行うことができます。NAここでは、正しい要素が識別されたことを確認しやすくするために、示された要素を次のように置き換えます。

> dmat
  c1 c2 c3
1  1  2  3
2  2  4  6
3  3  6  9
4  4  8 12
5  5 10 15
6  6 12 18
> dmat[(I - 1) * nrow(D) + seq_along(I)] <- NA
> dmat
  c1 c2 c3
1  1  2 NA
2  2 NA  6
3  3 NA  9
4  4  8 NA
5  5 NA 15
6 NA 12 18
于 2012-06-05T10:47:56.923 に答える
3

1 つの方法を次に示します。

d[which(i == 1), "c1"] <- "one"
d[which(i == 2), "c2"] <- "two"
d[which(i == 3), "c3"] <- "three"

   c1  c2    c3
1   1   2 three
2   2 two     6
3   3 two     9
4   4   8 three
5   5 two    15
6 one  12    18
于 2012-06-05T09:34:03.540 に答える
3

最初に data.frame をマトリックスに変換する場合は、2 列のマトリックスを使用して、置換対象の要素にインデックスを付けることができます。(R-2.16.0以降、これは data.frames で直接可能になります。) インデックス マトリックスは、最初の列に行インデックスを、2 番目の列に列インデックスを持つ必要があります。

次に例を示します。

## Create a subset of the your data
set.seed(12008); n  <- 6 
D  <- data.frame(c1=1:n, c2=2*(1:n), c3=3*(1:n))
i <- seq_len(nrow(D))            # vector of row indices
j <- sample(3, n, replace=TRUE)  # vector of column indices 
ij <- cbind(i, j)                # a 2-column matrix to index a 2-D array 
                                 # (This extends smoothly to higher-D arrays.)  

## Convert it to a matrix    
Dmat <- as.matrix(D)

## Replace the elements indexed by 'ij'
Dmat[ij] <- NA
Dmat
#      c1 c2 c3
# [1,]  1  2 NA
# [2,]  2 NA  6
# [3,]  3 NA  9
# [4,]  4  8 NA
# [5,]  5 NA 15
# [6,] NA 12 18

から、R-2.16.0データフレームに同じ構文を使用できるようになります (つまり、最初にデータフレームをマトリックスに変換する必要はありません)。

R-devel NEWSファイルから:

2 つの列の数値インデックスによるデータフレームのマトリックス インデックス付けが、置換と抽出でサポートされるようになりました。

現在のR-develスナップショットを使用すると、次のようになります。

D[ij] <- NA
D
#   c1 c2 c3
# 1  1  2 NA
# 2  2 NA  6
# 3  3 NA  9
# 4  4  8 NA
# 5  5 NA 15
# 6 NA 12 18
于 2012-06-07T16:36:56.770 に答える