2012-01-11 16 views
2

これは私の問題です。私は2つの異なるデータフレーム(AとB)を持っています。各データフレームの列は地理的局所性であり、行データは局所性の種である。今ループのループR

res<-list() 
for(i in 1:length(B)) {intersect(A[1], B[i])->res[[i]] 
} 

:私は、私はこのようなループを書いてこれを行うには、データフレームBのすべての地域の種のリストとデータ名声Aの産地1の種のリストと交差する必要がありますAのすべての地域をBのすべての地域と交差させなければならないと言うと、2、3、4、5,6、...の地域で同じループを繰り返す必要があります。

ありがとうございます。

+0

はSOへようこそ。サンプルデータを提供すると、質問は簡単に答えることができます。 –

答えて

3

結果として得たいものを完全に理解することは難しいです。しかし、私があなたのニーズを正しく推測すれば、以下のコードはあなたが望むことをするでしょう。このコードは、大規模なデータセットではあまり速く働かない可能性があるため、速度を向上させるためにもちろん最適化することができます。両方に同じ場所に存在する種を見つけることが、この場合、

A <- data.frame(
    London  = c(TRUE, TRUE, FALSE), 
    Manchester = c(FALSE, TRUE, FALSE), 
    Birmingham = c(TRUE, FALSE, TRUE), 
    row.names = c("rats", "mice", "foxes") 
) 

B <- data.frame(
    London  = c(TRUE, FALSE, FALSE), 
    Manchester = c(TRUE, TRUE, TRUE), 
    Birmingham = c(TRUE, TRUE, FALSE), 
    row.names = c("rats", "mice", "foxes")  
) 


> A 
     London Manchester Birmingham 
rats TRUE  FALSE  TRUE 
mice TRUE  TRUE  FALSE 
foxes FALSE  FALSE  TRUE 
> B 
     London Manchester Birmingham 
rats TRUE  TRUE  TRUE 
mice FALSE  TRUE  TRUE 
foxes FALSE  TRUE  FALSE 

:あなたは

res[[column_index_in_A]][[column_index_in_B]] 
+0

はい、はいはい!!!!!多くのありがとうDrDom!できます! – user1142777

1

を使用することができる結果にアクセスするに

res <- list() 
for (i in 1:ncol(A)) { 
    res[[i]] <- list() 
    for (j in 1:ncol(B)) { 
    res[[i]][[j]] <- intersect(A[,i], B[,j]) 
    } 
} 

はここにあなたのデータで野生の推測ですデータセット、必要なだけです

as.matrix(A) & as.matrix(B) 
+0

ありがとうございますが、私は似たようなインデックスを計算する必要があるので、動物リストの交差点に注意を集中させる必要があります – user1142777

5

lapply()を使用するネストされたループと同様のアプローチです。

大きなデータセットを使用している場合は、lapply()を使用すると、ループを使用するよりも大幅にスピードが向上する可能性があります。 Rはループが遅く、可能であればthe *apply familyにベクトル化された関数を使用することをお勧めします。

私は例を説明し、おそらくそれをデータセットに適用することができます。

まず、我々は、サンプルの3×3のデータフレームを作るの列abc、および行defで、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にしたいとしましょうdft(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)をもう一度読み、これらの結果を読む方法を参照してください:

ベクトル ad交差

$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 

再びベクトルaeで、

df$at(df)$dt(df)$et(df)$fと交差でのが見てみましょう

そして最後に、ベクトルafと:{3,1,2}^{2,2,2} = {2}

resultフォロー中の他のアイテム。あなたのとして地域、転置データフレームの列としてデータフレームの列を考える、あなたのデータセットにこれを拡張するために

。上記のようにlapply()を使用してください。


は、内側lapply()で、ネストされたlapply()文を打破開始するには:

lapply(as.data.frame(t(df)), function(y) ...) 

これはつまり、t(df)内のすべての列ベクトル - 列の$ D、$ eとの$ F - 変数yfunction(y)で表されます。私たちは...に戻ってきます。

は、今度は外lapply()を見てみましょう:

lapply(df, function(x) ...) 

これが何を意味するのかはdf内のすべての列ベクトルことをされた - の列は、$ bと$ cを$ - function(x)に変数xで表現されています。

次に、...について説明します。

外側...xの任意の関数である - これは等length()sum()、であり、さらに別のlapply()ができます。内部のlapply()は独自の関数と変数名yを持っているので、内部の...xyの両方の関数を実行できます。

だから、私たちが何をすべきかです:dfのすべての列ベクトルのために、私たちはそのdf - ベクトルおよび転置t(df)内のすべての列ベクトルについて関数を実行します。この例では、我々はxy上で実行する関数はintersect()です:

> result <- lapply(df, function(x) lapply(as.data.frame(t(df)), function(y) intersect(x,y))) 
+0

これは非常に興味深い手順です。これは私が実験した最初の方法ですが、今は恋愛の仕方が分かります。説明は非常に便利です。ありがとう – user1142777