【发布时间】:2012-01-05 20:49:50
【问题描述】:
我正在尝试比较存储在两个数据帧(foo、bar)中的变量集(X)。每个X 是一个唯一的自变量,最多有10 个Y 值与之关联。我想通过比较它们共有的Y 值的数量来比较每个 foo.X 和每个 bar.X - 所以输出可能是一个矩阵,其轴的长度为 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'))
编辑:
我将以下代码留给其他新手学习(for 循环是有效的,但可能非常次优),但下面的两个解决方案是有效的。特别是 Ramnath 对 data.table 的使用在处理非常大的数据帧时非常有效。
使用 stack 函数将数据帧存储为 y 值的列表
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)
}
}
【问题讨论】:
标签: r dataframe data.table