Как рассчитать совпадающие объекты без удаления NA или 0 - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть вывод, например, как показано ниже:

ID C1 C2 C3 C4 C5 C6
1  0  1  2  2  1  1
2  0  1  1  2  1  1
3  1  0  1  1  1  1
4  2  0  2  2  1  2
5  2  1  1  0  2  2
6  1  2  1  0  1  2
7  2  2  2  2  0  2
8  1  1  1  1  0  1
9  1  1  2  2  2  0
10 1  2  1  2  1  0

, и я определяю одновременное появление объектов на примере из более быстрого способа сравнения строк во фрейме данных

for ( i in 1:(nr-1)) {
# all combinations of i with i+1 to nr
samplematch <- cbind(dt[i],dt[(i+1):nr])

# renaming the comparison sample columns
setnames(samplematch,append(colnames(dt),paste0(colnames(dt),"2")))

#calculating number of matches
samplematch[,noofmatches := 0]

for (j in 1:nc){
samplematch[,noofmatches := noofmatches+1*(get(paste0("CC",j)) == get(paste0("CC",j,"2")))]
  }

# removing individual value columns and matches < 5
samplematch <- samplematch[noofmatches >= 5,list(ID,ID2,noofmatches)]

# adding to the list
totalmatches[[i]] <- samplematch
}

Результат, полученный с помощью вышеуказанной функции, помогает мне определить общее совпадение между каждым идентификатором.Однако я должен идентифицировать соответствующий идентификатор только тогда, когда CC (1: 6) состоит только из значений 1 и 2. Это означает, что общее значение для каждой строки должно быть 5, а не 6.

Выход, который яrequire должен содержать такую ​​информацию, как

ID1 ID2 Match
1    2   4/5
1    3   2/5
1    4   3/5
:    :    :
:    :    :
2    3   3/5
2    4   2/5

Как должна быть написана функция без удаления каких-либо строк, поскольку каждая строка имеет значение 0.

1 Ответ

0 голосов
/ 09 декабря 2018

В приведенном ниже коде IDs - это таблица данных всех пар различных ID с.Затем необходимо проверить x <- df[c(ID1, ID2), -1], столбцы без идентификатора df, соответствующие заданной паре ID, для каждой строки.Код создает логический вектор, равный TRUE для ненулевых столбцов (x[1] != 0) и столбцов с равными элементами (x[2] == x[1]).Тогда сумма этого вектора равна количеству совпадений.

library(data.table)
setDT(df)
setkey(df, ID)

IDs <- CJ(ID1 = df$ID, ID2 = df$ID)[ID1 != ID2]
IDs[, Match := {x <- df[c(ID1, ID2), -1] 
                sum(x[1] != 0 & x[2] == x[1])} 
    , by = .(ID1, ID2)]

head(IDs)
#    ID1 ID2 Match
# 1:   1   2     4
# 2:   1   3     2
# 3:   1   4     3
# 4:   1   5     1
# 5:   1   6     1
# 6:   1   7     2

Используемые данные:

df <- fread('
ID C1 C2 C3 C4 C5 C6
1  0  1  2  2  1  1
2  0  1  1  2  1  1
3  1  0  1  1  1  1
4  2  0  2  2  1  2
5  2  1  1  0  2  2
6  1  2  1  0  1  2
7  2  2  2  2  0  2
8  1  1  1  1  0  1
9  1  1  2  2  2  0
10 1  2  1  2  1  0
')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...