假设我有一个数据框,其中包含因子" 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数据帧,前两列表示正在比较的两个主题级别,第三列包含此范数计算。
不提供样本数据集的道歉。我希望答案很简单,但如果需要,我会尝试编写一些代码来生成一个。
答案 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(.))))