2016-01-29 9 views
1

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

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.

+0

Существует опечатка в вашем MWE. Пожалуйста исправьте. –

+0

@Pascal исправлено, спасибо – user2205916

+0

Сначала ваш образец с 'rep' неверен в соответствии с описанием. Возможно использование: 'samp <- matrix (sample (c (seq (1,5,1)), size = 1000, replace = TRUE), nrow = 100)' – N8TRO

ответ

2

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

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) -м колонок ] ... основное индексирование

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

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 
+0

Спасибо, я попробую и вернусь к вам. – user2205916

+0

Как суммировать элементы каждой строки до индексов, найденных выше в векторном виде? – user2205916

2

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

library(matrixStats) 
apply(rowCumsums(samp)>=10, 1, which.max)