Заполнить фрейм данных результатом функции

У меня есть следующий код для заполнения фрейма данных результатом функции по строкам. Результат функции внутри цикла является случайным (часть симуляции):

input <- as.data.frame(matrix(seq(1:20),4,5), row.names = c("A", "B", "C", "D"))
output <- data.frame()

j = 1
for (rowname in rownames(input)) {
   output <- rbind(output,ifelse(runif(5)+2>=rep(1/input[j,1],5),round(rgamma(5,shape=0.8, rate=2),0),rep(0,5)))
   j = j+1
}
rownames(output) <- rownames(input)

Я хотел бы избежать цикла for, и я думаю, должен быть способ сделать это с меньшим количеством строк и более эффективным способом в R. У вас есть идея, как это сделать?

В идеале хотелось бы передать все аргументы уже во время создания фрейма выходных данных.


person mondano    schedule 18.02.2015    source источник
comment
@akrun Я думаю, что мы пытаемся зациклиться столько раз, сколько строк.   -  person zx8754    schedule 18.02.2015
comment
Я знаю, я использую его только для перебора фрейма данных. Я уверен, что есть лучший способ (возможно, длина), мои знания R слишком ограничены. Основной проблемой, которую я хочу избежать, является цикл for.   -  person mondano    schedule 18.02.2015
comment
Пожалуйста, объясните, что происходит внутри цикла.   -  person zx8754    schedule 18.02.2015
comment
@zx8754 zx8754 Я добавил краткое разъяснение того, что происходит внутри цикла. Тем не менее, я полагаю, что способ избежать цикла for в этом случае не зависит от функции ifelse. Это может быть любая другая функция, возвращающая вектор.   -  person mondano    schedule 18.02.2015


Ответы (1)


Что-то вроде этого:

ifelse(
  matrix(runif(prod(dim(input)))+2,nrow=nrow(input)) >= 1/input,
  matrix(round(rgamma(prod(dim(input)),shape=0.8, rate=2),0),nrow=nrow(input)),
  0)
person zx8754    schedule 18.02.2015