lapply()
を使用するネストされたループと同様のアプローチです。
大きなデータセットを使用している場合は、lapply()
を使用すると、ループを使用するよりも大幅にスピードが向上する可能性があります。 Rはループが遅く、可能であればthe *apply
familyにベクトル化された関数を使用することをお勧めします。
私は例を説明し、おそらくそれをデータセットに適用することができます。
まず、我々は、サンプルの3×3のデータフレームを作るの列a
、b
とc
、および行d
、e
とf
で、df
と呼ばれる:
> df <- data.frame(a = sample(3), b = sample(3), c = sample(3))
> rownames(df) <- c('d','e','f')
はのはdf
とその転置t(df)
を見てみましょう:
> df
a b c
d 3 1 3
e 1 3 1
f 2 2 2
> t(df)
d e f
a 3 1 2
b 1 3 2
c 3 1 2
intersect
の列vectにしたいとしましょうdf
とt(df)
です。結果は、交差点の結果を示し、list()
ある
> result <- lapply(df, function(x) lapply(as.data.frame(t(df)), function(y) intersect(x,y)))
:私たちは今、両方のdf
から列ベクトルでintersect()
を実行するために、ネストされたlapply()
文を使用して転置t(df)
> is.list(result)
[1] TRUE
> print(result)
$a
$a$d
[1] 3 1
$a$e
[1] 3 1
$a$f
[1] 2
$b
$b$d
[1] 1 3
$b$e
[1] 1 3
$b$f
[1] 2
$c
$c$d
[1] 3 1
$c$e
[1] 3 1
$c$f
[1] 2
だがdf
を見てみましょうとt(df)
をもう一度読み、これらの結果を読む方法を参照してください:
ベクトル
a
と
d
交差
$a
$a$d
[1] 3 1
:{3,1,2}^{1,3,1} = {3,1}
$a$f
[1] 2
01:
{3,1,2}^{3,1,3} = {3,1}
$a$e
[1] 3 1
再びベクトルa
とe
で、
はdf$a
がt(df)$d
、t(df)$e
とt(df)$f
と交差でのが見てみましょう
そして最後に、ベクトルa
とf
と:{3,1,2}^{2,2,2} = {2}
result
フォロー中の他のアイテム。あなたの種として地域、転置データフレームの列としてデータフレームの列を考える、あなたのデータセットにこれを拡張するために
。上記のようにlapply()
を使用してください。
は、内側lapply()
で、ネストされたlapply()
文を打破開始するには:
lapply(as.data.frame(t(df)), function(y) ...)
これはつまり、t(df)
内のすべての列ベクトル - 列の$ D、$ eとの$ F - 変数y
がfunction(y)
で表されます。私たちは...
に戻ってきます。
は、今度は外lapply()
を見てみましょう:
lapply(df, function(x) ...)
これが何を意味するのかはdf
内のすべての列ベクトルことをされた - の列は、$ bと$ cを$ - function(x)
に変数x
で表現されています。
次に、...
について説明します。
外側...
はx
の任意の関数である - これは等length()
、sum()
、であり、さらに別のlapply()
ができます。内部のlapply()
は独自の関数と変数名y
を持っているので、内部の...
はx
とy
の両方の関数を実行できます。
だから、私たちが何をすべきかです:df
のすべての列ベクトルのために、私たちはそのdf
- ベクトルおよび転置t(df)
内のすべての列ベクトルについて関数を実行します。この例では、我々はx
とy
上で実行する関数はintersect()
です:
> result <- lapply(df, function(x) lapply(as.data.frame(t(df)), function(y) intersect(x,y)))
はSOへようこそ。サンプルデータを提供すると、質問は簡単に答えることができます。 –