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

时间:2015-02-18 07:07:59

标签: r dplyr

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

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

返回n-by-2数据框,subject和dmat为列。我想做每个成对减法的矩阵规范。有点像:

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

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

不提供样本数据集的道歉。我希望答案很简单,但如果需要,我会尝试编写一些代码来生成一个。

1 个答案:

答案 0 :(得分:0)

您可以使用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(.))))