避免在R中使用lapply(),并找到向量B的所有元素,满足向量A的每个元素的条件

米克

我有两个向量。对于向量A的每个元素,我想知道向量B满足特定条件的所有元素因此,例如,两个包含向量的数据帧:

person <- data.frame(name = c("Albert", "Becca", "Celine", "Dagwood"),
                 tickets = c(20, 24, 16, 17))
prize <- data.frame(type = c("potato", "lollipop", "yo-yo", "stickyhand", 
                         "moodring", "figurine", "whistle", "saxophone"),
                cost = c(6, 11, 13, 17, 21, 23, 25, 30))

对于此示例,“人”数据框中的每个人都具有来自狂欢节游戏​​的许多票,而“奖品”数据框中的每个奖品都具有成本。但是我不是在寻找完美的搭配。他们不只是简单地购买奖品,而是随机获得在其所持票券的5英镑成本容限范围内的任何奖品。

我正在寻找的输出是每个人可能赢得的所有可能奖品的数据框。就像这样:

    person      prize
1   Albert stickyhand
2   Albert   moodring
3   Albert   figurine
4   Albert    whistle
5    Becca   moodring
6    Becca   figurine
       ...        ...

等等。现在,我正在使用进行此操作lapply(),但这实际上并不比for()R中循环

library(dplyr)
matching_Function <- function(person, prize, tolerance = 5){
  matchlist <- lapply(split(person, list(person$name)),
                      function(x) filter(prize, abs(x$tickets-cost)<=tolerance)$type)
  longlist <- data.frame("person" = rep(names(matchlist), 
                                    times = unlist(lapply(matchlist, length))),
                         "prize" = unname(unlist(matchlist))
  )
  return(longlist)
}
matching_Function(person, prize)

我的实际数据集大得多(在几十万),和我的匹配条件比较复杂(检查从坐标,看看他们是否从坐标的设定范围内一个),所以这是考虑永远(几个小时) 。

是否有更聪明的方法不是for()lapply()解决呢?

滕西拜

用另一种foverlapsdata.table做你希望的东西:

require(data.table)

# Turn the datasets into data.table
setDT(person)
setDT(prize)
# Add the min and max from tolerance
person[,`:=`(start=tickets-tolerance,end=tickets+tolerance)]
# add a dummy column for use as range
prize[,dummy:=cost]
# Key the person table on start and end
setkey(person,start,end)
# As foverlaps to get the corresponding rows from prize into person, filter the NA results and return only the name and type of prize
r<-foverlaps(prize,person,type="within",by.x=c("cost","dummy"))[!is.na(name),list(name=name,prize=type)]
# Re order the result by name instead of prize cost
setorder(r,name)

输出:

       name      prize
 1:  Albert stickyhand
 2:  Albert   moodring
 3:  Albert   figurine
 4:  Albert    whistle
 5:   Becca   moodring
 6:   Becca   figurine
 7:   Becca    whistle
 8:  Celine   lollipop
 9:  Celine      yo-yo
10:  Celine stickyhand
11:  Celine   moodring
12: Dagwood      yo-yo
13: Dagwood stickyhand
14: Dagwood   moodring

我希望我对代码的注释足以说明自己。


对于问题的第二部分,使用坐标并在半径范围内进行测试。

person <- structure(list(name = c("Albert", "Becca", "Celine", "Dagwood"), 
                         x = c(26, 16, 32, 51), 
                         y = c(92, 51, 25, 4)), 
                    .Names = c("name", "x", "y"), row.names = c(NA, -4L), class = "data.frame")
antenas <- structure(list(name = c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L"), 
                          x = c(40, 25, 38, 17, 58, 19, 34, 38, 67, 26, 46, 17), 
                          y = c(36, 72, 48, 6, 78, 41, 18, 28, 54, 8, 28, 47)), 
                     .Names = c("name", "x", "y"), row.names = c(NA, -12L), class = "data.frame")

setDT(person)
setDT(antenas)
r<-10

results <- person[,{dx=x-antenas$x;dy=y-antenas$y; list(antena=antenas$name[dx^2+dy^2<=r^2])},by=name]

Data.table允许在中进行表达式j,因此我们可以针对每个人对天线进行外部联接的数学运算,并仅返回具有天线名称的相关行。

这不应该消耗太多内存,因为它是针对个人的每一行而不是整个行完成的。

受此问题启发的数学

这给:

> results
     name antena
1:  Becca      L
2: Celine      G
3: Celine      H

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从向量B的每个元素中减去向量A的每个元素

来自分类Dev

选择矩阵满足条件的向量的元素

来自分类Dev

R:来自具有两个条件的元素向量的所有长度的所有组合

来自分类Dev

显示向量的所有元素

来自分类Dev

如何找到所有与键向量相对应的元素?

来自分类Dev

当我们寻找向量的所有元素的所有匹配索引时,R中是否存在避免使用循环的函数?

来自分类Dev

将向量的元素与相同向量的所有元素相乘

来自分类Dev

将向量的元素与相同向量的所有元素相乘

来自分类Dev

在matlab中使用条件/如果替换向量元素

来自分类Dev

计算R中所有以下向量元素的乘积

来自分类Dev

从满足特定条件的向量中取出元素

来自分类Dev

确定每个向量元素是否超过所有先前的元素

来自分类Dev

R:找到一个向量中没有出现在另一个向量中的每个元素并将其设置为零

来自分类Dev

R:如何将向量的所有元素除以所有其他元素的总和

来自分类Dev

CUDA:所有向量元素的级联求和

来自分类Dev

C ++:如何在向量向量中打印所有元素

来自分类Dev

以相同顺序将向量的所有元素与向量匹配

来自分类Dev

以相同顺序将向量的所有元素与向量匹配

来自分类Dev

C ++:如何在向量向量中打印所有元素

来自分类Dev

在R中添加条件向量元素

来自分类Dev

在R中添加条件向量元素

来自分类Dev

R每个向量入口的所有排列

来自分类Dev

R应用于向量列表;提取向量元素以在函数中使用

来自分类Dev

比较两个向量内的时间,并找到R中每个元素的最近点

来自分类Dev

如何找到R中向量中每个元素的文本字符串的匹配位置?

来自分类Dev

如何在列表上使用lapply时访问向量的元素

来自分类Dev

如何找到向量元素的乘积?

来自分类Dev

向量的所有元素之间的逐元素乘法

来自分类Dev

R-根据现有向量的元素创建新向量

Related 相关文章

  1. 1

    从向量B的每个元素中减去向量A的每个元素

  2. 2

    选择矩阵满足条件的向量的元素

  3. 3

    R:来自具有两个条件的元素向量的所有长度的所有组合

  4. 4

    显示向量的所有元素

  5. 5

    如何找到所有与键向量相对应的元素?

  6. 6

    当我们寻找向量的所有元素的所有匹配索引时,R中是否存在避免使用循环的函数?

  7. 7

    将向量的元素与相同向量的所有元素相乘

  8. 8

    将向量的元素与相同向量的所有元素相乘

  9. 9

    在matlab中使用条件/如果替换向量元素

  10. 10

    计算R中所有以下向量元素的乘积

  11. 11

    从满足特定条件的向量中取出元素

  12. 12

    确定每个向量元素是否超过所有先前的元素

  13. 13

    R:找到一个向量中没有出现在另一个向量中的每个元素并将其设置为零

  14. 14

    R:如何将向量的所有元素除以所有其他元素的总和

  15. 15

    CUDA:所有向量元素的级联求和

  16. 16

    C ++:如何在向量向量中打印所有元素

  17. 17

    以相同顺序将向量的所有元素与向量匹配

  18. 18

    以相同顺序将向量的所有元素与向量匹配

  19. 19

    C ++:如何在向量向量中打印所有元素

  20. 20

    在R中添加条件向量元素

  21. 21

    在R中添加条件向量元素

  22. 22

    R每个向量入口的所有排列

  23. 23

    R应用于向量列表;提取向量元素以在函数中使用

  24. 24

    比较两个向量内的时间,并找到R中每个元素的最近点

  25. 25

    如何找到R中向量中每个元素的文本字符串的匹配位置?

  26. 26

    如何在列表上使用lapply时访问向量的元素

  27. 27

    如何找到向量元素的乘积?

  28. 28

    向量的所有元素之间的逐元素乘法

  29. 29

    R-根据现有向量的元素创建新向量

热门标签

归档