Матрица инцидентности для двудольных групп с несколькими объединениями

Мне было интересно, есть ли быстрый способ получить матрицу заболеваемости для такой проблемы. У меня есть два фрейма данных с тремя столбцами (ключи объединения)

df1 <- data.frame(K1=c(1,1,0,1,3,2,2),K2=c(1,2,1,0,2,0,1),K3=c(0,0,3,2,1,3,0))
df2 <- data.frame(K1=c(1,2,0,3),K2=c(0,1,2,0),K3=c(2,0,3,1))

и мне нужно получить соответствующую матрицу заболеваемости

# IM:
#   1 2 3 4
# 1 1 1 0 0
# 2 1 0 1 0
# 3 0 1 1 0
# 4 1 0 0 0
# 5 0 0 1 1
# 6 0 1 1 0
# 7 0 1 0 0

где это установлено 1 если есть совпадение между соответствующими KEY (значение столбца) строк двух фреймов данных. Я бы сделал с помощью нескольких циклов

for (j in seq_len(nrow(df2)))
  for (k in seq_len(ncol(df2))) {
    if (df2[j,k])
      m[which(df1[,k] == df2[j,k]),j] <- 1
  }

но это подход C и, возможно, что-то быстрее в R. У вас есть другие идеи? Кроме того, когда data.frame довольно большой (около 50 тыс. И 20 тыс. Строк), я не могу выделить матрицу, так как она кажется слишком большой.

0 ответов

Другие вопросы по тегам