У меня возникают проблемы с вызовом векторов в массиве, а не весь массив как один вектор - PullRequest
1 голос
/ 29 марта 2019

Я создаю массив, который содержит десять тысяч векторов, где каждый вектор имеет 4 символьных вектора, которые могут быть либо «выиграть», либо «проиграть».

Затем я хочу вызвать каждый отдельный вектори использовать функцию «any» для возврата TRUE, если любой символьный вектор в каждом векторе равен «win», и false в противном случае.АКА, если вектор c («потерять», «потерять», «потерять», «потерять»), он возвращает ЛОЖЬ, а в противном случае - ИСТИНА.

Я, конечно, хочу сделать все это сразу,и я подумал, что это можно сделать либо пропустив массив векторов через функцию «any» и получить обратно массив, как это разрешено другой функцией, либо используя функцию «apply» с массивом и «any () ==»ИСТИНА аргументы.

B <- 10000

set.seed(1)

a <- replicate(B, sample(c("lose","win"), 4, replace = TRUE, prob = c(0.6, 0.4)))

Вариант 1

celtic_wins <- any(a[,1:10000] == "win")

ИЛИ

Вариант 2

celtic_wins <- apply(a, any() == "win")

Что на самом деле происходит в обоих случаях (Я думаю, но не могу быть уверен), что массив разбирается на вектор векторов, который затем обрабатывается как один длинный вектор из 40000 элементов, проверяет, существует ли один символьный вектор "win" во всем лоте (которыйкак 99.99999999 ....% кейса) и, таким образом, возвращает один оператор TRUE, а не 10 000 логических значений.

Если это так, я не знаю, как создать обходной путь;пожалуйста помогите?

Ответы [ 2 ]

1 голос
/ 29 марта 2019

Вы можете увидеть, является ли 'win' частью столбца x, проверив, является ли сумма x == 'win' положительной. a == 'win' даст матрицу с теми же размерами, что и a, с элементами, равными TRUE, если соответствующий элемент a равен 'win', и FALSE в противном случае. colSums(a == 'win') создает вектор, i-й элемент которого является суммой столбца i в матрице a == 'win'.

colSums(a == 'win') > 0
1 голос
/ 29 марта 2019

дает ли это то, что вы хотите?

apply(a,MARGIN = 2, FUN = function(x) {any(x=="win")})

как упомянуто ниже @Gregor, это можно упростить до:

apply(a == "win", MARGIN = 2, any)

Первая версия может помочь вам лучше понять функцию apply() и то, что делают аргументы, но как только вы поймете, что делает apply(), я бы использовал в работе вторую версию (@ версию Грегора), поскольку она проще и чище.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...