【问题标题】:How to merge tables and fill the empty cells in the mean time in R?如何在R中合并表格并同时填充空单元格?
【发布时间】: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

【问题讨论】:

    标签: r join


    【解决方案1】:

    你可以试试

    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提供设置密钥功能。
    • @Arun 你的意思是setDT(a, key=ID),但还没有实现?
    • 对。 setDT(dat, col1, col2, ...) 可能还有 setDTv(dat, key = c("col1", "col2"))...
    • @Arun 这样看起来更方便
    • @akrun 感谢您的帮助!我只是想知道“AGE := i.AGE”的含义。在data.table包的帮助文件中没有找到对应的解释。
    【解决方案2】:

    假设您在第一个表格的每个位置都有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
    

    【讨论】:

    • 感谢您的建议!另一个问题是:如果表 a 和表 b 都有另一列不共享,是否有进行合并、填充空单元格并将两个额外列保留在结果表中的方法?例如,表 a 有一个额外的 STATE 列,表 b 有一个额外的 COUNTY 列?谢谢!
    • 当然可以,但是这样就行不通了。生病添加编辑与该问题的另一种解决方案。
    【解决方案3】:

    另一个答案中的包将起作用。如果您不想使用该软件包,这是一个肮脏的黑客:

    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
    

    但是,我会使用这个包来避免笨拙的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多