如何合并表格并在R中平均填充空单元格?

时间:2015-04-17 14:39:14

标签: r join

假设有两个表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

3 个答案:

答案 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,您可以使用rbindna.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

但是,我会使用该软件包来避免笨重的代码。