【问题标题】:multiply two dataframes by matching rows and columns通过匹配行和列将两个数据帧相乘
【发布时间】:2022-01-20 07:05:02
【问题描述】:

我想通过将 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 中匹配的列相乘。输出应如下所示:

输出

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

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

【问题讨论】:

  • 这个问题与python或pandas有关吗?
  • @JonSpring 我正在尝试这样做是 R 但任何 python 解决方案也值得赞赏

标签: python r pandas dataframe


【解决方案1】:

更新

我们可以试试

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
)

【讨论】:

  • @ThomaslsCoding 感谢您的解决方案。该代码有效,但输出中的行和列是随机生成的。我的实际数据框非常大,我需要问题中指定的有序输出数据框。关于如何实现的任何建议?
  • @JunaidAhmad 查看我的更新
猜你喜欢
  • 2013-02-17
  • 2021-11-10
  • 2021-11-19
  • 2021-09-10
  • 1970-01-01
  • 2021-03-10
  • 1970-01-01
相关资源
最近更新 更多