R查找data.table数据和data.table随机值之间的匹配

时间:2017-01-13 19:11:42

标签: r data.table

无法获得好的头衔,希望以下内容能解释我之后所做的事情。对于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

1 个答案:

答案 0 :(得分:0)

  

对于dtRandom中的每一行,我想知道dtFamilies中有多少行符合最大和最小猫和狗的标准。

以这种方式:

#!/usr/bin/tclsh

puts [exec ./t1]
puts "exit tcl"

工作原理

要根据不等式与另一个表中的变量选择行,我们需要一个非等式连接:

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

要计算符合某些条件的行,我们可以使用DT[dtRandom, on=.(Dogs >= DogsMin, Dogs <= DogsMax, Cats >= CatsMin, Cats <= CatsMax)]

使用.N,我们会为by=.EACHIi的每一行计算此计数。

有关详细信息,请参阅x[i, on, j, by=.EACHI]