![](/img/trans.png)
[英]Python comparing columns of two dataframes and producing index of matching rows
[英]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.