R

时间:2017-08-20 19:47:22

标签: r dataframe

这是一个不寻常和困难的问题,困扰了我好几天,我希望我能正确解释。我有两个数据库,即R中的数据帧,第一个是大约90,000行,是英国每个赛马的记录。它包含许多领域,最重要的是每匹马及其SIRE的名称;每匹马一条记录First database, sample and fields。第二个数据库包含超过一百万行,是过去十年中马参加过的每一场比赛的历史,即它已经运行的比赛或我称之为'外观',它包含NAME,DATE,TRACK等。 。每次出场一次记录。Second database, sample and fields

我试图做的是写几行代码 - 而不是循环 - 这将为我提供由特定马的兄弟所做的每一次外观的总数累计。第一步很容易 - 找到兄弟姐妹,即有共同父亲的马匹 - 你可以在下面看到它(NB FindSire是我自己的功能,通过引用相同的数据帧来完成它所说的并找到马的父亲。我已经简化了代码有点清晰)

 TestHorse <- "Save The Bees"

 Siblings <- which(FindSire(TestHorse) == Horses$Sire)

 Sibsname <- Horses[sibs,1]

产生名字长度为636的Sibsname(下面的代码段),尽管普通马只有50个左右的兄弟姐妹。我可以构造一个循环并搜索第二个'外观'数据框并单独匹配兄弟名称,然后总计所有兄弟姐妹的外观。但是,我想知道我是否可以避免循环 - 以及与之相关的时间 - 并编写几行代码来实现相同的目的,即在外观数据库中搜索所有636匹马并计算每个出现在数据库和所有这些外观,或换句话说,有多少种族有“拯救蜜蜂”的兄弟姐妹参加。事先谢谢。

 [1] "abdication "         "aberdonian "         "acclamatory "        "accolation "  ..... to [636] 

1 个答案:

答案 0 :(得分:1)

使用dplyr,调用“第一个数据库”horses和“第二个数据库”races

library(dplyr)
test_horse = "Save The Bees"

select(horses, Name, Sire) %>%
  filter(Sire == Sire[Name == tolower(test_horse)]) %>%
  inner_join(races, c("Name" = "SELECTION_NAME")) %>%
  summarize(horse = test_horse, sibling_group_races = n()) 

我假设您希望兄弟组的出现次数包括测试马的外观 - 省略它们而不是, Name != tolower(test_horse)命令添加filter()

由于您没有重复共享数据,我无法测试代码。如果您有其他问题,我将无法帮助您解决这些问题,除非您可重复地共享数据。 ycw的评论有一个有用的链接 - 我鼓励你编辑你的问题,包括(a)代码来模拟一小部分数据,或(b)对你的小数据样本使用dput()以复制/可粘贴格式共享几行。

上面的代码可以一次查询一匹马 - 如果你打算经常使用它,那么创建一个表格会更加简单,每个行代表一个兄弟组并包含种族数量。然后你可以只参考表而不是每次都在计算。这看起来像这样:

sibling_appearances = 
  left_join(horses, races, by = c("Name" = "SELECTION_NAME")) %>%
  group_by(Sire) %>%
  summarize(offspring_appearances = n())