【问题标题】:Replace NAs using na.approx or na.spline for matrix data使用 na.approx 或 na.spline 替换矩阵数据的 NA
【发布时间】:2017-03-21 20:01:35
【问题描述】:

我对 R 很陌生,目前遇到一个问题,数据如下所示:

    ID      h1      h2     h3      h4      h5      h6     h7     h8  
    IP6_1  0.1800   NA    -0.8600  NA      0.0400 -0.1400 1.4400 1.4900  
    IP6_2 -0.0250 -0.3050 -1.1050 -1.2150  0.0250  1.2750 1.7950 1.3850  
    IP6_3  0.2125 -0.1875   NA    -1.2225 -0.1425  0.7325 1.6275 1.3975  
    IP6_4  0.0150   NA    -1.0450 -0.3550  0.2950 -0.0150 0.3850 0.3050  
    IP6_5  0.1200 -0.0900 -0.9100 -0.6500  0.0900 -0.2700 0.9100 1.1200  
    IP6_6  0.0200 -0.0200 -0.8400 -0.6600   NA    -0.0900 0.6200 0.0800 

数据有随机的 NA,我想使用 na.approx 替换它们。 我试过用它:

z_data <- zoo(cluster_data_wf[,-1])        
na.approx(z_data)

它根本不会替换任何 NA。

将不胜感激通过近似或三次样条插值通过样条进行线性插值来替换 NA。

编辑:最终输出仍应具有第一列 ID

【问题讨论】:

    标签: r data-processing


    【解决方案1】:

    像这样?

    require(zoo)
    cols = colnames(x[, -1])
    x = data.frame(ID=x[, 1], t(apply(x[, -1], 1, na.approx)))
    colnames(x)[-1] = cols
    print(x)
    
             ID      h1      h2     h3      h4      h5      h6     h7     h8
    1 IP6_1  0.1800 -0.3400 -0.860 -0.4100  0.0400 -0.1400 1.4400 1.4900
    2 IP6_2 -0.0250 -0.3050 -1.105 -1.2150  0.0250  1.2750 1.7950 1.3850
    3 IP6_3  0.2125 -0.1875 -0.705 -1.2225 -0.1425  0.7325 1.6275 1.3975
    4 IP6_4  0.0150 -0.5150 -1.045 -0.3550  0.2950 -0.0150 0.3850 0.3050
    5 IP6_5  0.1200 -0.0900 -0.910 -0.6500  0.0900 -0.2700 0.9100 1.1200
    6 IP6_6  0.0200 -0.0200 -0.840 -0.6600 -0.3750 -0.0900 0.6200 0.0800
    

    【讨论】:

    • 太棒了!您能解释一下为什么需要删除第一行并重新添加回来吗?
    • 我删除了第一列,因为它是一个字符串/因子,然后为每一行应用na.approx。您需要转置最终结果。
    【解决方案2】:

    该问题没有以可重复的方式提供输入,因此我们真的不知道您从什么开始;但是,如果我们在下面的注释中给出了可重现的内容,那么由于na.approx 按列操作,我们将其转置除第 1 列外,使用na.approx,将其转回并填充除第 1 列之外的所有内容:

    replace(DF, -1, t(na.approx(t(DF[, -1]))))
    

    给予:

         ID      h1      h2     h3      h4      h5      h6     h7     h8
    1 IP6_1  0.1800 -0.3400 -0.860 -0.4100  0.0400 -0.1400 1.4400 1.4900
    2 IP6_2 -0.0250 -0.3050 -1.105 -1.2150  0.0250  1.2750 1.7950 1.3850
    3 IP6_3  0.2125 -0.1875 -0.705 -1.2225 -0.1425  0.7325 1.6275 1.3975
    4 IP6_4  0.0150 -0.5150 -1.045 -0.3550  0.2950 -0.0150 0.3850 0.3050
    5 IP6_5  0.1200 -0.0900 -0.910 -0.6500  0.0900 -0.2700 0.9100 1.1200
    6 IP6_6  0.0200 -0.0200 -0.840 -0.6600 -0.3750 -0.0900 0.6200 0.0800
    

    注意:

    Lines <- " ID      h1      h2     h3      h4      h5      h6     h7     h8  
        IP6_1  0.1800   NA    -0.8600  NA      0.0400 -0.1400 1.4400 1.4900  
        IP6_2 -0.0250 -0.3050 -1.1050 -1.2150  0.0250  1.2750 1.7950 1.3850  
        IP6_3  0.2125 -0.1875   NA    -1.2225 -0.1425  0.7325 1.6275 1.3975  
        IP6_4  0.0150   NA    -1.0450 -0.3550  0.2950 -0.0150 0.3850 0.3050  
        IP6_5  0.1200 -0.0900 -0.9100 -0.6500  0.0900 -0.2700 0.9100 1.1200  
        IP6_6  0.0200 -0.0200 -0.8400 -0.6600   NA    -0.0900 0.6200 0.0800 "
    
    DF <- read.table(text = Lines, header = TRUE, as.is = TRUE)
    

    【讨论】:

    • 输入数据如您在注释中的那样。
    • 但问题声称na.approx(zoo(DF[, -1])) 忽略了 NA,但事实并非如此。事实上,它用线性插值替换所有 NA,除了开头或结尾的那些,因为您需要在每一侧都有一个值来插值。
    • 你说得对,数据和我的数据不完全一样。当我在开头或结尾有 NA 时,它不会被替换。 na.approx 如何用于 NA 位于开头或结尾的情况?
    • na.approx 在内部使用 approx 并将参数传递给它,因此您可以使用参数 rule = 2 将最外面的值扩展到末端的 NA。有关详细信息,请参阅 ?approx 中的 rule 参数。
    猜你喜欢
    • 2015-07-16
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 2016-06-26
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多