2017-09-05 63 views
5

实施例: 我有一个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中有重复,我希望每当有一个“A”时,它会在第二个df中添加一个新的列中相应的值(21000)。

回答

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

使用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 
2

,我更喜欢从dplyrleft_join第三种选择......这似乎与大数据帧比merge更快。

require(dplyr) 

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) 

dat1 <- left_join(dat1, dat2, by="x1") 
2

让我们与microbenchmark竞赛大型数据框,只是为了好玩!

创建大型dataframes各就各位

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更快大dataframes。

enter image description here

相关问题