【问题标题】:Efficient way to lookup in a data frame in R在 R 中查找数据帧的有效方法
【发布时间】:2018-09-26 13:21:41
【问题描述】:

好吧,也许我以狗、鱼和马为例是愚蠢的。 如果我有 Location 怎么办,即索引是它们所在的位置 1、2 和 3 的位置或其他位置。马 1 可以在位置 2 和 3

index    |Location 1|Location 2|Location 3|...                        
1        |Dog1      |Horse1    |Fish1   |
2        |Horse3    |Fish2     |Horse1  |
3        |Fish2     |Horse2    |Horse3  |
4        |Dog1      |Fish1     |Horse2  |
5        |...       |...       |...     |...

然后我想快速查找我的 data.frame 并找到所有索引值。我希望建立一个位置 1、位置 2 和位置 3 的字典。然后我可以输入 locatio1['dog1'] 并获取位置 1 中 dog1 的所有索引值。

在 python 中,我会构建一个 location1 的字典并拥有

location1_dict = {dog1 : [1, 4], Horse3 : [2], Fish2 : [3]}

location2_dict 等也是如此。

无论如何,r 中是否有一种有效的方法可以快速查找 data.frame。想象一下我有 10^6 行

【问题讨论】:

  • 试试df$index[df$Location1 == "dog1"],假设你的查找表是df
  • R 中你想要的是一个列表(“字典”),其中包含每个位置的列表,并且每个包含索引值的命名向量(命名为现有位置列中的每个现有值) .然后,您将能够通过调用thedictionary$location1$dog 等获取所需的信息。使用which() 函数获取每个位置中每个值的索引。然后你需要两个嵌套的 for 循环或者purrr::map* 类别函数。

标签: r performance lookup


【解决方案1】:

定义一个函数来获取索引值,然后将其lapply 传递给感兴趣的列。

locations <- function(x){
  y <- unique(x)
  sapply(y, grep, x, , ignore.case = TRUE, simplify = FALSE)
}

res <- lapply(df1[-1], locations)

str(res)
#List of 3
# $ Location.1:List of 3
#  ..$ Dog1  : int [1:2] 1 4
#  ..$ Horse3: int 2
#  ..$ Fish2 : int 3
# $ Location.2:List of 4
#  ..$ Horse1: int 1
#  ..$ Fish2 : int 2
#  ..$ Horse2: int 3
#  ..$ Fish1 : int 4
# $ Location.3:List of 4
#  ..$ Fish1 : int 1
#  ..$ Horse1: int 2
#  ..$ Horse3: int 3
#  ..$ Horse2: int 4

数据。

df1 <-
structure(list(index = c(1, 2, 3, 4), Location.1 = c("Dog1", 
"Horse3", "Fish2", "Dog1"), Location.2 = c("Horse1", "Fish2", 
"Horse2", "Fish1"), Location.3 = c("Fish1", "Horse1", "Horse3", 
"Horse2")), row.names = c(NA, -4L), class = "data.frame")

【讨论】:

    猜你喜欢
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    • 2016-06-27
    • 2018-07-08
    • 1970-01-01
    相关资源
    最近更新 更多