5

これが(の一部)データフレーム「df」です:

11変数「v1」~「v11」

およびインデックス列「indx」(1 <= indx <= 11)。

"indx" は別のデータ フレームの前の手順で取得され、"df" にマージされました。

> df
    v1 v2  v3  v4  v5 v6  v7 v8 v9 v10 v11 indx
1  223  0  95 605  95  0   0  0  0 189   0   10
2   32  0   0  32   0 26   0  0  0  32   0    6
3    0  0 127  95  64 32   0  0  0 350   0   10
4  141  0 188   0 361  0   0  0  0 145   0    3
5   32  0 183   0 127  0   0  0  0 246   0    3
6   67  0 562   0   0  0   0  0  0 173   0    3
7   64  0 898   0   6  0   0  0  0   0   0    3
8    0  0  16   0  32  0   0  0  0  55   0   10
9    0  0 165   0   0  0 312  0  0 190   0   10
10   0  0 210   0   0  0 190  0  0  11   0    7

値が「v(indx)」である新しい列「vsel」を作成する必要があります

(つまり、1 行目: vsel=189 indx=10 および v10=189 のため)

「for」ループを使用して、この結果を正常に取得しました。

> df
    v1 v2  v3  v4  v5 v6  v7 v8 v9 v10 v11 indx vsel
1  223  0  95 605  95  0   0  0  0 189   0   10  189
2   32  0   0  32   0 26   0  0  0  32   0    6   26
3    0  0 127  95  64 32   0  0  0 350   0   10  350
4  141  0 188   0 361  0   0  0  0 145   0    3  188
5   32  0 183   0 127  0   0  0  0 246   0    3  183
6   67  0 562   0   0  0   0  0  0 173   0    3  562
7   64  0 898   0   6  0   0  0  0   0   0    3  898
8    0  0  16   0  32  0   0  0  0  55   0   10   55
9    0  0 165   0   0  0 312  0  0 190   0   10  190
10   0  0 210   0   0  0 190  0  0  11   0    7  190

コードは次のとおりです。

df$vsel = NA
for (i in seq(1:nrow(df))   )
{
  r = df[i,]
  ind = r$indx
  df[i,"vsel"] = r[ind]
}

... このループは避けたいと思います (データ フレームが大きいとかなり遅いため)。

おそらく(より高速な)Rタイプの方法があります:

おそらく apply(df, 1, ...) で?

またはddply?

助けてくれてありがとう…</p>

4

3 に答える 3

1

出来るよ :

f <- function(i){df[i,df[i,]$indx]}
temp <- sapply(FUN=f,X=1:length(df[,1]))
cbind(df,vsel=temp)
于 2012-08-03T13:26:06.077 に答える
1

これは、速度の点で打ち負かすのが難しい、完全にベクトル化されたソリューションです。

df$vsel <- as.matrix(df)[1:nrow(df) + nrow(df)*(df$indx-1)]

これは、行列が長いベクトル (列単位) として内部的に格納されているという事実を利用しています。これ1:nrow(df)により、行とnrow(df)*(df$indx-1)列が指定されます。dfでデータ型が混在している場合、すべてが によって文字列に変換されるため、これは機能しませんas.matrix

于 2012-08-03T13:40:26.870 に答える