【问题标题】:Eliminate for-loop through functional programming通过函数式编程消除for循环
【发布时间】:2018-11-26 05:48:20
【问题描述】:

我想从带有systemName 变量和popNum 变量的数据帧中获取输入,并使用它来生成一个命名的向量列表,其元素是随机数(1-6)*5 即 (5, 10, 15, 20, 25, 30) 其中向量长度等于系统的popNum。

以下代码有效:

## Data
#Create a vector of integers
popNum <- c (2,5,3,9)
#Create corresponding names
systemNames <- c("Ruie", "Regina", "Roupe", "Efate")
# form up into a recatangular data frame
dataSource <- cbind.data.frame(systemNames,popNum )

## Create and Fill the List
#initialise the list
availableCargoes <- vector( mode = "list", length = nrow(dataSource))

#name the list
names(availableCargoes) <- dataSource$systemNames

#fill the list 
for (loopCounter in 1:nrow(dataSource)) {
availableCargoes[[loopCounter]] <- sample.int( n = 6, 
                                             size = dataSource$popNum[loopCounter],
                                             replace = TRUE) * 5
}

如何通过 apply 系列或 purrr 包中的某些内容摆脱 for 循环?我很难解决的问题是Xlapply 运行sample.int 的原因吗?如何将popNum 的向量作为参数传递来控制结果向量的大小?

【问题讨论】:

  • data.frame(systemNames, popNum ) 就够了,不用cbind

标签: r for-loop lapply


【解决方案1】:

使用lapply 直接循环通过dataSource$popNum
请注意,我设置了 RNG 种子以使结果可重现。

set.seed(1234)
for (loopCounter in 1:nrow(dataSource)) {
  availableCargoes[[loopCounter]] <- sample.int( n = 6, 
                                                 size = dataSource$popNum[loopCounter],
                                                 replace = TRUE) * 5
}

set.seed(1234)
ac <- lapply(dataSource$popNum, function(s) 
  sample.int(n = 6, size = s, replace = TRUE)*5)
names(ac) <- dataSource$systemNames
ac

identical(availableCargoes, ac)
#[1] TRUE

【讨论】:

    【解决方案2】:

    应用版本

    ## Data
    #Create a vector of integers
    popNum <- c (2,5,3,9)
    #Create corresponding names
    systemNames <- c("Ruie", "Regina", "Roupe", "Efate")
    # form up into a recatangular data frame
    dataSource <- cbind.data.frame(systemNames,popNum )
    
    ## Create and Fill the List
    #initialise the list
    availableCargoes <- vector( mode = "list", length = nrow(dataSource))
    
    #name the list
    names(availableCargoes) <- dataSource$systemNames
    
    #fill the list 
    
    availableCargoes <- sapply(as.character(dataSource$systemNames),function(sysname){
    
      sample.int( n = 6, 
                  size = dataSource$popNum[dataSource$systemNames==sysname],
                  replace = TRUE) * 5
    },USE.NAMES=T,simplify = F)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-08
      • 2018-08-29
      • 2014-01-29
      • 1970-01-01
      • 1970-01-01
      • 2020-05-20
      • 2015-05-21
      相关资源
      最近更新 更多