быстрый способ сравнить два ряда - PullRequest
0 голосов
/ 03 июля 2019

У меня большой массив данных с 2 строками и 30406 столбцами. Мне нужно посчитать, сколько раз 0 присутствует в обеих строках в данном столбце (совпадение) и сколько раз 0 присутствует в одной строке, а не в другом, если задан столбец (без совпадения).

Я думаю, что если я просто переберу все и сравниваю каждый столбец, это займет слишком много времени, учитывая, что> 30k столбцов

head(to_compare)[1:5]
     bin:82154:182154 bin:82154:282154 bin:82154:382154 
bin:82154:482154
1-D1.txt                0                1                2                
0
1-D2.txt                1                1                1                
1
     bin:82154:582154
1-D1.txt                0
1-D2.txt                0

выход

match
1

no_match
1

Ответы [ 4 ]

3 голосов
/ 03 июля 2019

Вы можете использовать colSums для векторизованного решения:

set.seed(123)
df <- as.data.frame(matrix(round(runif(50, 0, 2)), nrow = 2))

# Match 
sum(colSums(df==0) == 2)
[1] 2

# No match
sum(colSums(df==0) == 1)
[1] 8
1 голос
/ 03 июля 2019

Другой и очень простой подход заключается в том, чтобы сначала переключать столбцы на строки, а затем просто использовать rowSums:

#Create sample df
df <- data.frame(col1 = c(0,1), col2 = c(1,0), col3 = c(1,1), col4 = c(0,2), col5 = c(3,0), col6 = c(0,0))

#Convert columns to rows
df_long <- t(df)

#Count number of 0s in every row and show in table of 0, 1 or 2 zeros
table(rowSums(df_long == 0))

0 1 2 
1 4 1 
1 голос
/ 03 июля 2019
set.seed(123)
df <- as.data.frame(matrix(round(runif(10, 0, 2)), nrow = 2))

# Count the number of 0 for each column
sum(apply(df, 2, function(x) all(x == 0))) # Match

# Count the number of 0 is present in one row and not in another for each column
sum(apply(df, 2, function(x) any(x == 0) & (x[1] != x[2]))) # No match
0 голосов
/ 03 июля 2019
set.seed(7)
n <- 30406
to_compare <- data.frame(matrix(floor(runif(n*2, 0, 3)), nrow = 2))

table(colSums(to_compare==0))
#    0     1     2 
#13519 13513  3374 
#
#0..no zero in column (13519)
#1..one row in column has a zero (13513)
#2..both rows in column are zero (3374)

system.time(table(colSums(to_compare==0)))
#       User      System verstrichen 
#      0.332       0.000       0.330 
...