【问题标题】:How to multiply columns in a dataframe (or matrix) by another dataframe's columns one by one and sum the results?如何将数据框(或矩阵)中的列与另一个数据框的列一一相乘并对结果求和?
【发布时间】:2020-01-08 22:08:21
【问题描述】:

我正在尝试将两个数据帧 x 和 y 相乘,它们的行数相同但列数不同。我需要将 x 的每一列乘以 y 的每一列。

我已经尝试了几件事并解决了问题,但我需要让它自动化,因为现在有点手动。

示例数据:

>x
    a   b   c   d
Jan 2   4   8   6
Feb 5   8   3   6
Mar 4   8   2   3
Apr 4   4   5   6


>y
    e   f   g   h   j   k   l   m
Jan 5   6   8   7   2   3   4   6
Feb 2   5   7   9   6   3   4   5
Mar 9   2   5   5   5   3   2   1
Apr 2   7   5   4   1   2   3   5

在 R 中,

    a1<-data.frame(a=colSums(data.frame(x[,1]*y[,1:8])))
    a1
    a2<-data.frame(b=colSums(data.frame(x[,2]*y[,1:8])))
    a2
    a3<-data.frame(c=colSums(data.frame(x[,1]*y[,1:8])))
    a3
    a4<-data.frame(d=colSums(data.frame(x[,2]*y[,1:8])))
    a4

预期的结果是:

> a1
   a
e 64
f 73
g 91
h 95
j 58
k 41
l 48
m 61

> a2
    b
e 116
f 108
g 148
h 156
j 100
k  68
l  76
m  92
> a3
    c
e  74
f 102
g 120
h 113
j  49
k  49
l  63
m  90
> a4
    d
e  81
f 114
g 135
h 135
j  69
k  57
l  72
m  99

 a5<-data.frame(c(a1,a2,a3,a4))
  a   b   c   d
1 64 116  74  81
2 73 108 102 114
3 91 148 120 135
4 95 156 113 135
5 58 100  49  69
6 41  68  49  57
7 48  76  63  72
8 61  92  90  99

但是我有一个大数据集,所以为每一列做这件事会花费很多时间,有没有办法用循环或 for 来做?

【问题讨论】:

    标签: r dataframe matrix multiple-columns matrix-multiplication


    【解决方案1】:

    您可以使用lapply() 循环浏览您的data.frame 列。

    A <- as.data.frame(lapply(x, function(x_1) colSums(x_1 * y[, 1:8])))
    A
    
       a   b   c   d
    e 64 116  74  81
    f 73 108 102 114
    g 91 148 120 135
    h 95 156 113 135
    j 58 100  49  69
    k 41  68  49  57
    l 48  76  63  72
    m 61  92  90  99
    

    数据

    x <- read.table(text = 'a   b   c   d
    Jan 2   4   8   6
    Feb 5   8   3   6
    Mar 4   8   2   3
    Apr 4   4   5   6')
    
    
    y <- read.table(text = '    e   f   g   h   j   k   l   m
    Jan 5   6   8   7   2   3   4   6
    Feb 2   5   7   9   6   3   4   5
    Mar 9   2   5   5   5   3   2   1
    Apr 2   7   5   4   1   2   3   5')
    

    【讨论】:

      【解决方案2】:

      这又是矩阵乘法:

      mapply(`%*%`, x, list(as.matrix(y)))
      
      mapply(crossprod, x, list(as.matrix(y)))
      
      t(t(as.matrix(x)) %*% as.matrix(y))
      #      a   b   c   d
      #[1,] 64 116  74  81
      #[2,] 73 108 102 114
      #[3,] 91 148 120 135
      #[4,] 95 156 113 135
      #[5,] 58 100  49  69
      #[6,] 41  68  49  57
      #[7,] 48  76  63  72
      #[8,] 61  92  90  99
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-19
        • 1970-01-01
        • 2022-01-23
        • 2020-11-03
        • 2017-12-08
        • 2015-04-07
        • 2023-03-20
        • 2014-03-03
        相关资源
        最近更新 更多