运行 数据框列中所有对象对的函数

Run function on all pairs of objects in column of data frame

假设我有一个包含因子 "subject" 和连续变量 "a" 和 "b" 的数据框。对于每个级别的主题,我从 a 和 b 创建一个距离矩阵:

data %>%
group_by(subject) %>%
select(a,b) %>%
do(dmat = as.matrix(dist(.)))

这个 returns 一个 n×2 数据框,主题和 dmat 作为列。我想对每个成对减法做矩阵范数。大致如下:

norm(data$dmat[[1]]-data$dmat[[2]])
norm(data$dmat[[1]]-data$dmat[[3]])
# etc etc

理想情况下,我会得到一个 n^2×3 数据框,前两列表示正在比较的两个主题级别,第三列包含此范数计算。

抱歉没有提供示例数据集。我希望答案足够简单,但如果需要的话,我会尝试编写一些代码来生成一个。

您可以为此使用 mapply

data %>%
  group_by(subject) %>%
  select(a,b) %>%
  do(dmat = as.matrix(dist(.))) %>% 
  ungroup %>%
  do(data.frame(s1 = rep(.$subject, each=nrow(.)), 
                s2 = rep(.$subject, times=nrow(.)), 
                dist = mapply(rep(.$dmat, each=nrow(.)), 
                              rep(.$dmat, times=nrow(.)), 
                              FUN=function(x, y) norm(x-y))))

我可能会发现这个结果的矩阵表示更容易理解:

data %>%
  group_by(subject) %>%
  select(a,b) %>%
  do(dmat = as.matrix(dist(.))) %>% 
  ungroup %>%
  do(data.frame(matrix(mapply(rep(.$dmat, each=nrow(.)), 
                              rep(.$dmat, times=nrow(.)), 
                              FUN=function(x, y) norm(x-y)) , nrow=nrow(.))))