如何将数据框(或矩阵)中的列与另一个数据框的列一一相乘并对结果求和?
How to multiply columns in a dataframe (or matrix) by another dataframe's columns one by one and sum the results?
我正在尝试将两个数据框 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 来完成吗?
您可以使用 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')
这又是矩阵乘法:
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
我正在尝试将两个数据框 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 来完成吗?
您可以使用 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')
这又是矩阵乘法:
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