【问题标题】:Operate on pairs of rows of a data frame对数据帧的成对行进行操作
【发布时间】:2010-04-11 03:05:37
【问题描述】:

我在 R 中有一个数据框,我想对所有行对执行计算。有没有比使用嵌套 for 循环更简单的方法?

为了具体说明,考虑一个有 10 行的数据框,我想计算所有 (45) 个可能对之间的分数差异。

> data.frame(ID=1:10,Score=4*10:1)
   ID Score
1   1    40
2   2    36
3   3    32
4   4    28
5   5    24
6   6    20
7   7    16
8   8    12
9   9     8
10 10     4

我知道我可以使用嵌套的 for 循环进行此计算,但有没有更好(更 R-ish)的方法呢?

【问题讨论】:

    标签: r


    【解决方案1】:

    要计算差异,也许你可以使用

    outer(df$Score,df$Score,"-")
    

    【讨论】:

      【解决方案2】:

      这里使用combn的另一个解决方案:

      df <- data.frame(ID=1:10,Score=4*10:1)
      cm <- combn(df$ID,2)
      delta <- df$Score[cm[1,]]-df$Score[cm[2,]]
      

      或者更直接

      df <- data.frame(ID=1:10,Score=4*10:1)
      delta <- combn(df$ID,2,function(x) df$Score[x[1]]-df$Score[x[2]])
      

      【讨论】:

      • 哦,我很喜欢combn功能。
      • 我正在尝试在具有多列的数据框上复制它,但无法使其工作。 @teucer 可能会展示如何做到这一点吗?例如。如果有 score1、score2、score3 等。为了清楚起见,[1,2] 和 [2,2] 之间的区别,而不是 sum[1,] 和 sum[2,]。因此,您最终会得到一个列数与原始列数相同但行数更多的数据框。
      【解决方案3】:
      colmx = matrix(rep(df[,2], 10), ncol=10, byrow=F)
      rowmx = matrix(rep(df[,2], 10), ncol=10, byrow=T)
      delta = colmx - rowmx
      

      【讨论】:

      • ~ubuntu 和我得到了相同的答案; 'outer' 是对我明确进行的矩阵计算的包装,它解释了两者之间的性能差异——对于 100 x 100 矩阵,平均超过 100 次试验,内置仅慢 10% 左右——考虑到所有测量这类东西的伪影,我会说那是在噪声阈值之内。
      【解决方案4】:

      dist() 是你的朋友。

      dist(df$Score)
      

      你可以把它当作一个矩阵:

      as.matrix( dist(df$Score) )
      

      【讨论】:

      • 我怎么会错过(另一个)内置的?!无论如何,不​​错,我 +1。
      猜你喜欢
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 2020-08-20
      • 2020-08-20
      • 1970-01-01
      • 2013-08-16
      • 2019-01-03
      • 1970-01-01
      相关资源
      最近更新 更多