R Векторизация: как вернуть индекс первого элемента каждой строки в матрице, которая соответствует условию, и суммировать все элементы до этого индекса?

Я ищу векторизованное решение. Скажем, я генерирую 100 образцов из 10 розыгрышей с заменой. Далее я хочу найти первый индекс первого элемента матрицы накопительных сумм, что означает какое-то условие, скажем, >=10. Затем я хочу суммировать все элементы каждой строки до индекса первого элемента, удовлетворяющего этому условию. MWE:

set <- c(1, 5, 7, 13, 15, 17)
samp <- samp <- matrix(sample(set, size = 100*10, replace = TRUE), nrow=simCount) # generate 100 samples of 10 draws
b <- matrix(apply(samp, 1, cumsum), 
  nrow = 100, byrow=TRUE) >= 10 # compare each element with 10, return boolean

Я не знаю, как использовать apply с which(x)=="TRUE". Я пробовал несколько вариантов, но я не уверен, как правильно кодировать.

После того, как я это получу, я смогу использовать apply(b, 1, min) для возврата первого элемента (минимальный индекс) для каждой строки >=10.


person user2205916    schedule 29.01.2016    source источник
comment
В вашем MWE есть опечатка. Пожалуйста исправьте.   -  person    schedule 29.01.2016
comment
@Pascal исправлено, спасибо   -  person user2205916    schedule 29.01.2016
comment
Во-первых, ваш образец с rep неверен по описанию. Возможно использовать: samp <- matrix(sample(c(seq(1,5,1)), size = 1000, replace = TRUE), nrow=100)   -  person N8TRO    schedule 29.01.2016
comment
@N8TRO Хороший улов, спасибо! Определенно не хочу повторять свои розыгрыши. Исправлена.   -  person user2205916    schedule 29.01.2016
comment
Я не уверен, что часть b имеет смысл, но я добавил ее в ответ, чтобы быть тщательным.   -  person N8TRO    schedule 29.01.2016


Ответы (2)


Установите seed, пожалуйста, для "случайных" примеров:

set.seed(111)
samp <- matrix(sample(1:5, s=1000, r=T), nrow=100)
(answer1 <- samp[which(apply(samp,1,function(x)sum(x)>30)),1])
# [1] 4 3 3 3 1 1 3 5 2 4 2 5 4 2 4 1 3 2 4 4 5 4 2 4 5 5 4 5 3 3 1 1 2 1 4 3 4 5
#[39] 1 5 1 4 4 3 3 2 5 5

Объяснение:

apply(samp,1, function(x) sum(x) > 30)
Ну, если вы добавите 10 положительных целых чисел, >=10 ВСЕГДА будет истинным. применить к "samp" для каждой строки эту функцию.

which(x) возвращает индекс всех ИСТИННЫХ значений x. (интересующие строки)

samp[(строки, которые возвращаются), (1)st column] ... базовая индексация

разворачивать шаг за шагом снаружи внутрь для лучшего понимания.

b <- matrix(apply(samp, 1, cumsum), nrow=100, byrow=T)>=10
apply(b,1,function(x)which(x)[1])
#  [1] 4 5 4 3 3 5 3 4 3 4 3 3 5 4 5 4 2 4 3 6 3 3 5 4 3 3 2 4 4 6 3 4 3 4 5 4 4
# [38] 4 3 5 3 6 3 3 5 5 3 3 4 6 4 5 4 4 3 4 4 4 2 5 3 4 3 4 4 3 4 6 3 5 4 4 4 4
# [75] 3 3 5 4 4 3 3 4 4 5 4 4 4 3 4 3 5 4 3 5 3 6 4 5 5 3
person N8TRO    schedule 29.01.2016
comment
Спасибо, я попробую и вернусь к вам. - person user2205916; 29.01.2016
comment
Как мне суммировать элементы каждой строки до индексов, найденных выше, векторизованным способом? - person user2205916; 31.01.2016

Мы могли бы использовать rowCumsums из library(matrixStats)

library(matrixStats)
apply(rowCumsums(samp)>=10, 1, which.max)
person akrun    schedule 29.01.2016