繁体   English   中英

通过匹配行和列将两个数据帧相乘

[英]multiply two dataframes by matching rows and columns

我想通过将 Df1 中的行与 DF2 中的列名相匹配来将两个数据帧或矩阵相乘。 数据框看起来像

Df1<- 
| ID   |Value|
|:---- |:----|
| 105  |213|
| 105  |214|
| 90  |215|
| 90  |216|
| 100  |217|

Df2<- 
| 90 | 100 | 105 |
|:---- |:------:| -----:|
| 10 | 11    | 12 |
| 15  | 20    | 25 |
| 20  | 25    | 30 |

我的目标是将 Df1 中的“ID”与 Df2 中的列名相匹配,并将 Df1 中的值与 Df2 中匹配的列相乘。 output 应如下所示:

输出<-

C1 C2 C3
213*12 214*12 215*10
213*25 214*25 215*15
213*30 214*30 215*20

什么是最快和最方便的方法来做到这一点。 我对 R 比较陌生,非常感谢任何帮助。

更新

我们能试试

with(
  df1,
  as.data.frame(t(t(unname(df2[as.character(ID)])) * Value))
)

这使

    V1   V2   V3   V4   V5
1 2556 2568 2150 2160 2387
2 5325 5350 3225 3240 4340
3 6390 6420 4300 4320 5425

也许这个带有reshape + merge的基本 R 代码可能会有所帮助

reshape(
  transform(
    type.convert(
      merge(df1, stack(df2), by.x = "ID", by.y = "ind", all = TRUE),
      as.is = TRUE
    ),
    idx = ave(ID, ID, Value, FUN = seq_along),
    p = Value * values
  )[c("Value", "idx", "p")],
  direction = "wide",
  idvar = "idx",
  timevar = "Value"
)

这使

  idx p.215 p.216 p.217 p.213 p.214
1   1  3225  3240  5425  6390  6420
2   2  2150  2160  2387  2556  2568
3   3  4300  4320  4340  5325  5350

数据

df1 <- data.frame(
  ID = c(105, 105, 90, 90, 100),
  Value = 213:217
)

df2 <- data.frame(
  `90` = c(10, 15, 20),
  `100` = c(11, 20, 25),
  `105` = c(12, 25, 30),
  check.names = FALSE
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM