【发布时间】:2015-04-17 14:39:14
【问题描述】:
假设有两个表 a 和 b。
表a:
ID AGE
1 20
2 empty
3 40
4 empty
表b:
ID AGE
2 25
4 45
5 60
如何在R中合并两张表,使得结果表变成:
ID AGE
1 20
2 25
3 40
4 45
【问题讨论】:
假设有两个表 a 和 b。
表a:
ID AGE
1 20
2 empty
3 40
4 empty
表b:
ID AGE
2 25
4 45
5 60
如何在R中合并两张表,使得结果表变成:
ID AGE
1 20
2 25
3 40
4 45
【问题讨论】:
你可以试试
library(data.table)
setkey(setDT(a), ID)[b, AGE:= i.AGE][]
# ID AGE
#1: 1 20
#2: 2 25
#3: 3 40
#4: 4 45
a <- data.frame(ID=c(1,2,3,4), AGE=c(20,NA,40,NA))
b <- data.frame(ID=c(2,4,5), AGE=c(25,45,60))
【讨论】:
setDT提供设置密钥功能。
setDT(a, key=ID),但还没有实现?
setDT(dat, col1, col2, ...) 可能还有 setDTv(dat, key = c("col1", "col2"))...
假设您在第一个表格的每个位置都有NA,您可以使用第二个表格的年龄数字,您可以使用rbind 和na.omit。
例子
x <- data.frame(ID=c(1,2,3,4), AGE=c(20,NA,40,NA))
y <- data.frame(ID=c(2,4,5), AGE=c(25,45,60))
na.omit(rbind(x,y))
结果是你所追求的(尽管是无序的,我假设你只是忘记了 ID 5)
ID AGE
1 20
3 40
2 25
4 45
5 60
如果您想合并两个不同的data.frames 并保留列,则另当别论。您可以使用merge 来实现此目的。
这里有两个不同列的数据框:
x <- data.frame(ID=c(1,2,3,4), AGE=c(20,NA,40,NA), COUNTY=c(1,2,3,4))
y <- data.frame(ID=c(2,4,5), AGE=c(25,45,60), STATE=c('CA','CA','IL'))
将它们加在一起成为一个data.frame
res <- merge(x, y, by='ID', all=T)
给我们
ID AGE.x COUNTY AGE.y STATE
1 20 1 NA <NA>
2 NA 2 25 CA
3 40 3 NA <NA>
4 NA 4 45 CA
5 NA NA 60 IL
然后按摩成我们想要的形式
idx <- which(is.na(res$AGE.x)) # find missing rows in x
res$AGE.x[idx] <- res$AGE.y[idx] # replace them with y's values
names(res)[agrep('AGE\\.x', names(res))] <- 'AGE' # rename merged column AGE.x to AGE
subset(res, select=-AGE.y) # dump the AGE.y column
这给了我们
ID AGE COUNTY STATE
1 20 1 <NA>
2 25 2 CA
3 40 3 <NA>
4 45 4 CA
5 60 NA IL
【讨论】:
另一个答案中的包将起作用。如果您不想使用该软件包,这是一个肮脏的黑客:
x$AGE[is.na(x$AGE)] <- y$AGE[y$ID %in% x$ID]
> x
ID AGE
1 1 20
2 2 25
3 3 40
4 4 45
但是,我会使用这个包来避免笨拙的代码。
【讨论】: