【问题标题】:Calculate range represented by missing data - R计算缺失数据表示的范围 - R
【发布时间】:2018-03-22 21:10:02
【问题描述】:

我有一个数据集,其值在列中表示位置(这是 SNP/基因组学工作)。

我正在尝试找出一种方法来计算每段缺失数据的距离(“间隙” - 下面显示为 NA)。例如。 1466-1650 = 184

还想计算连续观察的范围,但猜想一旦我弄清楚了第一个问题,这将相对容易。例如。 1450-1466 = 16

以下是有关如何组织数据的示例:

1450
1466
NA
NA
1650
1654
1943
NA
2568

这个问题与我试图分析数据集中所有样本的下一个问题有关——循环遍历每个样本——请see my question here

【问题讨论】:

    标签: r


    【解决方案1】:

    希望这样的事情会有所帮助:

    选择非空行,然后找出它们之间的差异,然后将它们附加到不包括第一个索引的数据上。

    nonEmptyRows<-which(!is.na(df$data))
    df[nonEmptyRows[-1], "gaps"]<-diff(df$data[nonEmptyRows])
    
     data gaps
     1450   NA
     1466   16
       NA   NA
       NA   NA
     1650  184
     1654    4
     1943  289
       NA   NA
     2568  625
    

    【讨论】:

    • 谢谢!有没有办法将间隙长度(即 NA 之后的第一个值 - 例如 184)和连续长度(4+28​​9)提取到单独的列中?
    【解决方案2】:

    您可以使用rle 函数(运行长度编码)来执行此操作。像这样的...

    vec <- c(1450,1466,NA,NA,1650,1654,1943,NA,2568) #your data
    
    rl <- rle(is.na(vec)) #rle on whether values are NA
    

    这会产生

    rl
    Run Length Encoding
      lengths: int [1:5] 2 2 3 1 1
      values : logi [1:5] FALSE TRUE FALSE TRUE FALSE
    

    那么你可以像这样计算间隙长度

    gaps <- vec[cumsum(rl$lengths)[rl$values]+1] - #upper bound of each NA group
            vec[c(1,cumsum(rl$lengths))[rl$values]] #lower bound
    
    gaps
    [1] 184 625
    

    【讨论】:

    • 谢谢!我正在尝试使用连续的另一列,使用: rl2
    • 想通了,以防万一有人需要(PS 单个观察结果报告为 NA): cont
    猜你喜欢
    • 1970-01-01
    • 2018-12-20
    • 2022-08-24
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多