运行 数据框列中所有对象对的函数
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(.))))
假设我有一个包含因子 "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(.))))