假设有两个表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
答案 0 :(得分:2)
你可以尝试
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))
答案 1 :(得分:1)
假设您在第一个表格中要使用第二个表格的年龄数字的每个位置都有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
答案 2 :(得分:1)
另一个答案中的包将起作用。如果你不想使用这个包,这是一个肮脏的黑客:
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
但是,我会使用该软件包来避免笨重的代码。