【问题标题】:Vectorizing with R instead of for loop用 R 代替 for 循环向量化
【发布时间】:2014-07-11 16:22:34
【问题描述】:

我正在尝试使用其中一个应用函数对以下任务进行矢量化,但徒劳无功。 我有一个列表和一个数据框。我想要完成的是使用查找列表在数据框中创建子组。

查找列表(基本上是百分位组)如下所示:

Look_Up_List
$`1`
   A   B     C     D     E
0.000 0.370 0.544 0.698 9.655 

$`2`
   A   B     C     D     E
0.000 0.506 0.649 0.774 1.192 

当前数据框如下所示:

Score Big_group
0.1     1
0.4     1 
0.3     2

生成的数据框必须如下所示,并带有一个附加列。它与相应 Big_Group 中的查找列表中的百分位桶中的分数相匹配:

Score Big_group Sub_Group
0.1     1         A
0.4     1         B
0.3     2         A

非常感谢

【问题讨论】:

  • 标题中的拼写错误。
  • 最好能看到“velcrotizing”。

标签: r vectorization apply


【解决方案1】:

你可以像这样创建一个函数:

myFun <- function(x) {
  names(Look_Up_List[[as.character(x[2])]])[
    findInterval(x[1], Look_Up_List[[as.character(x[2])]])]
}

然后apply 与apply逐行:

apply(mydf, 1, myFun)
# [1] "A" "B" "A"'

【讨论】:

    【解决方案2】:
       # reproducible input data
        Look_Up_List <- list('1' <- c(A=0.000, B=0.370, C=0.544, D=0.698, E=9.655),
                             '2' <- c(A=0.000, B=0.506, C=0.649, D=0.774, E=1.192))
        Current <- data.frame(Score=c(0.1, 0.4, 0.3),
                              Big_group=c(1,1,2))
    
        # Solution 1
        Current$Sub_Group <- sapply(1:nrow(Current), function(i) max(names(Look_Up_List[[1]][Current$Score[i] > Look_Up_List[[1]] ])))
    
        # Alternative solution (using findInterval, slightly slower at least for this dataset)
        Current$Sub_Group <- sapply(1:nrow(Current), function(i) names(Look_Up_List[[1]])[findInterval(Current$Score[i], Look_Up_List[[1]])])
    
        # show result
        Current
    

    【讨论】:

    • Current$Sub_Group Look_Up_List[[1]] ]))),但这仅查找 Look_Up_List[[1]],而不是查找 Look_Up_List[[Big_group]]
    猜你喜欢
    • 2021-03-23
    • 1970-01-01
    • 2020-01-29
    • 1970-01-01
    • 1970-01-01
    • 2020-03-03
    • 2019-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多