Более быстрый способ подсчета строк, соответствующих значению в R - PullRequest
1 голос
/ 08 апреля 2020

Мой код работает, но он очень медленный. То, что я хочу сделать, это взять два вектора одинаковой длины, исследовать значения строка за строкой и посчитать количество строк, которые равны 1. Я хочу подчеркнуть, что я не собираюсь суммировать количество раз, которое каждый вектор сам по себе имеет значение 1. Скорее, когда эти векторы располагаются рядом, сколько раз мы видим, что обе строки равны 1?

Я сделал это с помощью a для l oop и оператор if, где I l oop проходит через «пары строк» ​​и увеличивает переменную на +1 каждый раз, когда совпадающая пара равна 1. Этот код находится ниже, но он слишком медленный. Я должен выполнить эту операцию с более чем 2000 векторами длиной не менее 4e6.

Относительно плохо знаком с R здесь, но если у кого-то есть какие-либо идеи относительно более быстрых способов, я благодарен за любые советы.

vec1 <- rep(c(0,0,1,1),times = 10)
vec2 <- rep(c(0,1,0,1),times = 10)

mat <- cbind(vec1,vec2)

matches <- 0
for(i in 1:length(mat[,1])){
  if(mat[i,1] == 1 & mat[i,2] == 1){
    matches <- matches + 1
  }
} 

Ответы [ 3 ]

1 голос
/ 08 апреля 2020

Если векторы имеют только значения 1 и 0:

sum(rowSums(mat) == 2)
#[1] 10

Если они могут иметь разные значения, сравните его с 1:

sum(rowSums(mat == 1) == 2)

Чтобы получить номера строк, в которых оба столбца имеют 1 мы могли бы использовать which:

which(rowSums(mat) == 2)
#[1]  4  8 12 16 20 24 28 32 36 40
0 голосов
/ 08 апреля 2020

Работа только на векторах:

sum(vec1 * vec2)
# [1] 10

sum(vec1 & vec2)
# [1] 10

sum(vec1[!!vec2])
# [1] 10

# and going mad
vec1 %*% vec2
#      [,1]
# [1,]   10

# or even
sum(Mod(complex(real = vec1, imaginary = vec2)) == sqrt(2)) #joking
# [1] 10
0 голосов
/ 08 апреля 2020

Go логично и суммировать, считается ИСТИНА и ЛОЖЬ как 1 и 0 соответственно

sum( (vec1 == 1) & (vec2 == 1))
#[1] 20
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...