Устранить цикл за счет функционального программирования - PullRequest
0 голосов
/ 26 ноября 2018

Я хотел бы взять входные данные из фрейма данных с переменной 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
}

Как я могу избавиться от цикла for через что-то из семейства apply или пакета purrr?Проблема, с которой я сталкиваюсь с трудностями, заключается в том, что за X над lapply работает sample.int?Как передать вектор popNum в качестве аргумента для управления размером результирующих векторов?

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Саппи версия

## 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)
0 голосов
/ 26 ноября 2018

Используйте lapply для прямого прохождения через dataSource$popNum.
Обратите внимание, что я установил начальное значение ГСЧ, чтобы сделать результаты воспроизводимыми.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...