从另一个df为df $列分配值?

时间:2017-09-05 22:32:23

标签: r

实施例: 我有一个df,第一列是

dat <- c("A","B","C","A")

然后我在第一列中有另一个df:

dat2[, 1]
[1] A B C
Levels: A B C

dat2[, 2]
[1] 21000 23400 26800

如何将第二个df(dat2)中的值添加到第一个df(dat)? 在第一个df中有重复,我希望每次有一个&#34; A&#34;它将在新列中添加第二个df的相应值(21000)。

4 个答案:

答案 0 :(得分:5)

生成可重现的数据帧......

dat1 <- data.frame(x1 = c("A","B","C","A"), stringsAsFactors = FALSE)
dat2 <- data.frame(x1 = c("A","B","C"),
                   x2 = c(21000, 23400, 26800), stringsAsFactors = FALSE)

然后使用match函数。

dat1$dat2_vals <- dat2$x2[match(dat1$x1, dat2$x1)]

将字符列转换为character类型而非factor类型或元素不匹配非常重要。由于dat2中的levels属性,我提到了这一点。

答案 1 :(得分:2)

我更喜欢的第三个选项是来自left_join的{​​{1}} ...它似乎比dplyr大数据帧快。

merge

答案 2 :(得分:2)

让我们用microbenchmark比赛大型数据帧,只是为了好玩!

创建大型数据框

dat1 <- data.frame(x1 = rep(c("A","B","C","A"), 1000), stringsAsFactors = FALSE)
dat2 <- data.frame(x1 = rep(c("A","B","C", "D"), 1000),
                   x2 = runif(1,0), stringsAsFactors = FALSE)

关于你的分数,得到设定,GO!

library(microbenchmark)
mbm <- microbenchmark(
  left_join = left_join(dat1, dat2, by="x1"),
  merge = merge(dat1, dat2, by = "x1"),
  times = 20
)

很多很多秒......对于大型数据帧,left_join MUCH 更快。

enter image description here

答案 3 :(得分:1)

使用merge功能。

# Input data
dat  <- data.frame(ID = c("A", "B", "C", "A"))
dat2 <- data.frame(ID = c("A", "B", "C"), 
                   value = c(1, 2, 3))
# Merge two data.frames by specified column
merge(dat, dat2, by = "ID")
  ID value
1  A     1
2  A     1
3  B     2
4  C     3