实施例: 我有一个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)。
实施例: 我有一个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)。
生成可重复的数据帧...
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
属性。
使用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
,我更喜欢从dplyr
left_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")
让我们与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。