【问题标题】:Run function on all pairs of objects in column of data frame对数据框列中的所有对象对运行函数
【发布时间】:2015-04-19 02:51:37
【问题描述】:

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

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

这将返回一个 n×2 数据框,其中 subject 和 dmat 作为列。我想做每个成对减法的矩阵范数。大致如下:

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

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

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

【问题讨论】:

  • 创建所有可能组合的组合(例如combn(1:3, 2))并使用forapply 系列函数对其进行迭代。

标签: r dplyr


【解决方案1】:

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

【讨论】:

  • 完美,谢谢!尽管在上面的例子中矩阵表示可能更容易理解,但为了简单起见,我忽略了几个因素,我正在研究因素间的距离是否大于因素内的距离,所以我需要能够保持编码的主题 ID。 rep() 中的“每个”与“时间”技巧对我来说是魔法。没想到!
猜你喜欢
  • 2015-11-06
  • 2017-05-21
  • 2022-11-02
  • 2022-12-31
  • 2014-06-23
  • 2021-07-12
  • 2019-03-13
  • 2015-10-22
  • 1970-01-01
相关资源
最近更新 更多