【问题标题】:fill in missing values based on available data when merging datasets in R在 R 中合并数据集时,根据可用数据填充缺失值
【发布时间】:2014-06-02 05:36:07
【问题描述】:

这是我的问题。我想合并 df1 和 df2 数据集。

>df1 
ID   Sub  Time Number  Base  Note
01   A01  100  20      20     Y
01   A01  110  35      20     NA
02   A02  100  15      15     Y
02   A02  150  35      15     NA
03   A04  120  10      10     Y
03   A04  130  25      10     NA
04   A05  90   19      19     Y
04   A05  130  50      19     NA
....

>df2
Sub  Time  Number
A01  150   55
A04  200   60
A05  200   80
A02  200   55
....

合并后的数据集应该是这样的:

>merged
ID   Sub  Time Number  Base  Note
01   A01  100  20      20    Y
01   A01  110  35      20    NA
01   A01  150  55      20    NA
02   A02  100  15      15    Y
02   A02  150  35      15    NA
02   A02  200  55      15    NA
03   A04  120  10      10    Y
03   A04  130  25      10    NA
03   A04  200  60      10    NA
04   A05  90   19      19    Y
04   A05  130  50      19    NA
04   A05  200  80      19    NA

如果有人在 R 中有任何解决方案,请告诉我。谢谢!

【问题讨论】:

    标签: r merge dataset


    【解决方案1】:

    df2添加适当的列后,您可以将两者一起rbind。然后,经过排序后,zoo 包中的na.locf 会将最后的观察结果向前传递。

    我在这里作弊,在df1$Note 中添加了一个新级别来代表该列中的原始NA 值,因此na.locf 将继续使用它们。

    这些值可以在结果中替换为NA,并且额外因子水平下降。

    require(zoo)
    
    levels(df1$Note) <- c(levels(df1$Note), 'NA')
    df1$Note[is.na(df1$Note)] <- 'NA'
    
    df2$ID <- NA ; df2$Base <- NA; df2$Note <- NA
    df <- rbind(df1, df2)
    df <- df[order(df$Sub, df$Time, df$Number),]
    as.data.frame(lapply(df, na.locf))
    ##    ID Sub Time Number Base Note
    ## 1   1 A01  100     20   20    Y
    ## 2   1 A01  110     35   20   NA
    ## 3   1 A01  150     55   20   NA
    ## 4   2 A02  100     15   15    Y
    ## 5   2 A02  150     35   15   NA
    ## 6   2 A02  200     55   15   NA
    ## 7   3 A04  120     10   10    Y
    ## 8   3 A04  130     25   10   NA
    ## 9   3 A04  200     60   10   NA
    ## 10  4 A05   90     19   19    Y
    ## 11  4 A05  130     50   19   NA
    ## 12  4 A05  200     80   19   NA
    

    【讨论】:

      【解决方案2】:

      您可以使用 library(plyr) 中的命令 rbind.fill:

      require(plyr)
      require(zoo)
      merged = rbind.fill(df1, df2)
      merged = merged[order(merged$Sub),]
      merged$ID = na.locf(merged$ID)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-28
        • 2020-02-19
        • 2020-02-20
        • 1970-01-01
        • 2017-08-21
        • 1970-01-01
        • 1970-01-01
        • 2015-12-03
        相关资源
        最近更新 更多