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

标签 r dataframe dplyr

框架:

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/

相关文章:

r - 从 .tar.gz linux 创建 R Windows 二进制文件

r - 计算向量中相等数字序列的长度

python - 循环遍历一个数据框中的单个列与另一个数据框中的列进行比较使用 Pandas 在第一个数据框中创建新列

r - 我怎样才能编写一个 tidyverse 友好的函数,在管道的早期尊重 group_by() ?

r - 使用所选列中所有值的最大值有条件地更新某些列(data.table,r)

python - 基于 R 平方值创建数据框

python - 创建一个三维数据框(python)

r - 使用 enquo() 以 dplyr 语法编写可管道函数,不返回预期输出

r - R中的掩蔽方法

c++ - 将 R 代码转换为 C++ 以进行 Rcpp 实现