1

我有一个 100k+ obs 和 12 cols 的 df。其中一个列是某种 id,我需要使用它来制作基于另一个 df 的另一列。这个另一个df只有50个obs,一个col是id和我需要复制到第一个df的值。

我无法对此进行编码。这是一个部分 df(两者)我只显示这个问题的相关 cols

DF1(100k+ 观测值)

id
010100
010100
010100
010100
010100
010100
010200
010200
010200
010201
010201
010201
010201
010201
010201
010201
010300
010300
010300
010300
010300
010400
010400
010400
010500
010500
010501
010501
010501
010600
010600
010600
010600

这是带有值和 id 的第二个 df

id         val
010100  1
010200  2
010201  2
010300  3
010400  4
010500  5
010501  6
010600  7

我需要的是 val 在 df 的新列中,具体取决于两个 df 的 id,如下所示:

id  New
010100  1
010100  1
010100  1
010100  1
010100  1
010100  1
010200  2
010200  2
010200  2
010201  2
010201  2
010201  2
010201  2
010201  2
010201  2
010201  2
010300  3
010300  3
010300  3
010300  3
010300  3
010400  4
010400  4
010400  4
010500  5
010500  5
010501  6
010501  6
010501  6
010600  7
010600  7
010600  7
010600  7

任何想法都值得赞赏。谢谢你的时间。

问候

4

2 回答 2

3

merge是你想要的,或者你可能会注意到使用data.table包的一些速度优势:

df1 <- data.frame(id = 1:3)
df2 <- data.frame(id = rep(1:3, each = 2), val = rnorm(6))

> merge(df1, df2)
  id        val
1  1  0.9462113
2  1 -1.7835754
3  2 -1.1604525
4  2  0.2498844
5  3 -1.5187111
6  3  0.5921281

library(data.table)
dt1 <- data.table(df1, key = "id")
dt2 <- data.table(df2, key = "id")

> dt1[dt2]
     id        val
[1,]  1  0.9462113
[2,]  1 -1.7835754
[3,]  2 -1.1604525
[4,]  2  0.2498844
[5,]  3 -1.5187111
[6,]  3  0.5921281

有关可用连接类型、匹配列等的详细信息,请参阅帮助页面?merge。 data.table FAQ 可能是了解该包细微差别的最佳场所:http://datatable.r-forge.r-project .org/datatable-faq.pdf

于 2012-04-19T18:08:44.170 回答
3

你可以尝试这样的事情:

df3 <- merge(df1, df2, by="id", all = TRUE)

您需要设置all = TRUE,否则 df3 中将仅存在 df2 行。

于 2012-04-19T18:08:51.467 回答