2017-01-13 5 views
1

良いタイトルが出てこなかったので、私が何をしているのかを次のように説明してください。 dtRandomのすべての行について、dtFamiliesの行がmaxとminの猫と犬の基準にどれくらい一致しているかを知りたい。私はdtFamiliesで最大と最小の犬や猫の条件に一致する行数を知りたいdtRandomのすべての行についてはRデータのdata.tableとランダムな値のdata.tableの一致を見つける

require(data.table) 
dtFamilies <- data.table(Family=c('Smith','Jones','White','Harris'), 
       Dogs=c(7,0,2,1), 
       Cats=c(0,3,0,8)) 

lowDogs <- min(DT[,Dogs]) 
highDogs <- max(DT[,Dogs]) 
lowCats <- min(DT[,Cats]) 
highCats <- max(DT[,Cats]) 

set.seed(1) 
DogsMin <- sample(lowDogs:highDogs,10,replace = T) 
DogsMax <- sample(lowDogs:highDogs,10,replace = T) 
CatsMin <- sample(lowCats:highCats,10,replace = T) 
CatsMax <- sample(lowCats:highCats,10,replace = T) 

dtRandom <- data.table(DogsMin,DogsMax, 
         CatsMin,CatsMax) 

dtRandom <- transform(dtRandom, 
       DogsMin = ifelse(DogsMin < DogsMax, DogsMin, DogsMax), DogsMax = ifelse(DogsMax > DogsMin, DogsMax, DogsMin), 
       CatsMin = ifelse(CatsMin < CatsMax, CatsMin, CatsMax), CatsMax = ifelse(CatsMax > CatsMin, CatsMax, CatsMin)) 


# I now have dtFamilies which is a list of families and the number of dogs and cats that they have. 
# I also have dtRandom which has 10 rows of random values for min and max number of pets 

# Below obviously does not work 
    nrow(DT[Dogs >= DogsMin & Dogs <= DogsMax & 
    Cats >= CatsMin & Cats <= CatsMax])) 

私はRが新しく、多くの機能があります。適用方法はわかりません。いくつかの指針は非常に高く評価されます。私はループを使って機能する機能を持っていますが、私はループがRで悪く、Rメソッドが使用されるべきであると読んでいます。

私が何をしたいの例(単なる例 - これは、上記のデータと一致していません):私はdtFamiliesで最大の条件に一致する行数を知りたいdtRandomのすべての行については

DogsMin DogsMax CatsMin CatsMax Matches 
1:  0  5  3  6 1 
2:  6  6  2  3 0 
3:  1  7  2  7 2 
4:  1  4  4  6 1 
5:  6  6  0  7 3 
6:  5  6  4  4 0 
7:  2  5  4  8 4 
8:  2  3  2  4 0 
9:  1  5  3  4 1 
10:  0  4  1  5 1 
+0

コードに表示されない 'dtFamilies'テーブルがあります。サンプルを完全に再現性のあるものにするために、それを追加することをお勧めします。 – Frank

+1

私はあなたが 'DT [dtRandom、on =。(Dogs> = DogsMin、Dogs <= DogsMax、Cats> = CatsMin、Cats <= CatsMax)、.N、by = .EACHI]'を探していると推測しています。しかし..? – Frank

+0

@フランク - ありがとう。私は私の質問を更新しました。 – speedycorndog

答えて

0

ミニ猫と犬。

DT[dtRandom, on=.(Dogs >= DogsMin, Dogs <= DogsMax, Cats >= CatsMin, Cats <= CatsMax), 
    .N, by=.EACHI] 
それは

は、我々は非エクイを必要とする別のテーブル内の変数対不平等に基づいて行を選択するにはどのように動作する


が参加:

は、ここに1つの方法だ

DT[dtRandom, on=.(Dogs >= DogsMin, Dogs <= DogsMax, Cats >= CatsMin, Cats <= CatsMax)] 

いくつかの基準を満たす行をカウントするには、.Nを使用できます。

by=.EACHIとし、iの各行のこのカウントをx[i, on, j, by=.EACHI]に計算します。

詳細については、?data.tableを参照してください。