gpt4 book ai didi

r - 按 id 匹配并在两个数据帧中划分列值

转载 作者:行者123 更新时间:2023-12-04 10:10:59 29 4
gpt4 key购买 nike

框架:

df 1:包含多行具有相同 id 的 500 列值

    id|val.1|val.2|...|val.500
---------------------------------
1 | 240 | 234 |...|228
1 | 224 | 222 |...|230
1 | 238 | 240 |...|240
2 | 277 | 270 |...|255
2 | 291 | 290 |...|265
2 | 284 | 282 |...|285

df 2:仅包含一个唯一的 id(行),它与具有 500 个列值的 df-1 id 列匹配
    id|val.1|val.2|...|val.500
---------------------------------
1 | 250 | 240 |...|245
2 | 280 | 282 |...|281

我想根据 df 1 的列值除以 df 2 中的相应列值,最终得到 df 3:
    id|val.1|val.2|...|val.500
---------------------------------
1 | 0.96| 0.98|...|0.93
1 | 0.90| 0.93|...|0.94
1 | 0.95| 1.00|...|0.98
2 | 0.99| 0.96|...|0.91
2 | 1.04| 1.03|...|0.94
2 | 1.01| 1.00|...|1.01

基本上,df 1 的权重是 df 2 基于它们的 id 和列值。一段时间以来,我一直在摸索解决此问题的最佳方法,但没有取得太大进展。任何指导将不胜感激。谢谢

最佳答案

只要 data.frames 按列正确排序并且都具有相同的列,那么我认为以下基本 R 代码将完成您想要的。

cbind(df1[1], df1[-1] / df2[match(df1$id, df2$id), -1])

id val.1 val.2 val.500
1 1 0.9600000 0.9750000 0.9306122
2 1 0.8960000 0.9250000 0.9387755
3 1 0.9520000 1.0000000 0.9795918
4 2 0.9892857 0.9574468 0.9074733
5 2 1.0392857 1.0283688 0.9430605
6 2 1.0142857 1.0000000 1.0142349

在这里, match(df1$id, df2$id)将返回对应于 df2 的 ids 的 df1 的行索引,所以 df2[match(df1$id, df2$id), -1]将 df2 的相应行作为删除了 id 变量的 data.frame 返回。当 id 变量被移除并且 df1[-1] / df2[match(df1$id, df2$id), -1]执行除法。最后 cbind将 id 变量添加到最终的 data.frame。

数据
df1 <- structure(list(id = c(1L, 1L, 1L, 2L, 2L, 2L), val.1 = c(240L, 
224L, 238L, 277L, 291L, 284L), val.2 = c(234L, 222L, 240L, 270L,
290L, 282L), val.500 = c(228L, 230L, 240L, 255L, 265L, 285L)), .Names = c("id",
"val.1", "val.2", "val.500"), class = "data.frame", row.names = c(NA,
-6L))

df2 <- structure(list(id = 1:2, val.1 = c(250L, 280L), val.2 = c(240L,
282L), val.500 = c(245L, 281L)), .Names = c("id", "val.1", "val.2",
"val.500"), class = "data.frame", row.names = c(NA, -2L))

关于r - 按 id 匹配并在两个数据帧中划分列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41452097/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com