[英]R Find matches between a data.table of data and a data.table of random values
無法想出好的頭銜,希望以下內容能解釋我所追求的目標。 對於dtRandom中的每一行,我想知道dtFamilies中有多少行符合最大和最小貓和狗的標准。
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]))
對於dtRandom中的每一行,我想知道dtFamilies中有多少行符合最大和最小貓和狗的標准。
我是R的新手,有很多功能我不知道如何申請。 一些指導非常感謝。 我有使用循環的功能,但我一直在讀R中的循環不好,應該使用R方法。
我想要的例子(只是一個例子 - 這與上面的數據不匹配):
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
對於dtRandom中的每一行,我想知道dtFamilies中有多少行符合最大和最小貓和狗的標准。
這是一種方式:
DT[dtRandom, on=.(Dogs >= DogsMin, Dogs <= DogsMax, Cats >= CatsMin, Cats <= CatsMax),
.N, by=.EACHI]
這個怎么運作
要根據不等式與另一個表中的變量選擇行,我們需要一個非equi連接:
DT[dtRandom, on=.(Dogs >= DogsMin, Dogs <= DogsMax, Cats >= CatsMin, Cats <= CatsMax)]
要計算符合某些條件的行,我們可以使用.N
。
使用by=.EACHI
我們計算x[i, on, j, by=.EACHI]
每行i
這個計數。
有關詳細信息,請參閱?data.table
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.