Я пытаюсь сравнить наборы переменных (X
), которые хранятся в двух фреймах данных (foo
, bar
). Каждый X
является уникальной независимой переменной, с которой связано до 10 значений Y
. Я хотел бы сравнить каждый foo.X с каждым bar.X, сравнивая количество общих значений Y
, которые у них общие - так что на выходе могла бы быть матрица с осями foo.x длиной bar.x.
этот простой пример foo и bar хотел бы вернуть матрицу 2x2, сравнивая a, b с c, d:
foo <- data.frame(x= c('a', 'a', 'a', 'b', 'b', 'b'), y=c('ab', 'ac', 'ad', 'ae', 'fx', 'fy'))
bar <- data.frame(x= c('c', 'c', 'c', 'd', 'd', 'd'), y=c('ab', 'xy', 'xz', 'xy', 'fx', 'xz'))
EDIT:
Я оставил следующий код для изучения другими новичками (поскольку циклы эффективны, но, вероятно, очень неоптимальны), но два приведенных ниже решения эффективны. В частности, использование Рамнатом data.table очень эффективно при работе с очень большими фреймами данных.
сохраняет кадры данных в виде списков, в которых хранятся значения y с использованием функции stack
foo.list <- dlply(foo, .(x), function(x) stack(x, select = y))
bar.list <- dlply(bar, .(x),function(x) stack(x, select = y))
написать функцию для сравнения членства в двух составных списках
comparelists <- function(list1, list2) {
for (i in list1){
for (j in list2){
count <- 0
if (i[[1]] %in% j[[1]]) count <- count + 1
}
}
return count
}
написать выходную матрицу
output.matrix <- matrix(1:length(foo.list), 1:length(bar.list))
for (i in foo.list){
for (j in bar.list){
output.matrix[i,j] <- comparelists(i,j)
}
}