【问题标题】:R Convert NA's only after the first non-zero valueR仅在第一个非零值之后转换NA
【发布时间】:2014-01-08 04:29:13
【问题描述】:

我有一个大型数据集,其中包含一列 ID,然后是每个 ID 的每月时间序列。这个集合中经常有缺失值,但我想做的是用零替换第一个非零之后的所有 NA,同时将第一个非零值之前的所有 NA 保留为 NA。

例如。

[NA NA NA 1 2 3 NA 4 5 NA] 将更改为 [NA NA NA 1 2 3 0 4 5 0]

如果你们能提供任何帮助或建议,我们将不胜感激!

【问题讨论】:

    标签: r nan statistics


    【解决方案1】:

    使用match() 和数字索引很容易做到:

    • 使用match() 查找第一次出现的非NA 值
    • 使用which() 将逻辑向量从is.na() 转换为数字索引
    • 使用该信息在 x 中找到正确的位置

    因此:

    x <- c(NA,NA,NA,1,2,3,NA,NA,4,5,NA)
    isna <- is.na(x)
    nonna <- match(FALSE,isna)
    id <- which(isna)
    x[id[id>nonna]] <- 0
    

    给予:

    > x
     [1] NA NA NA  1  2  3  0  0  4  5  0
    

    【讨论】:

    • 很好,这是一个非常优雅的解决方案!您对如何将其扩展到数据框有什么建议吗? IE。相同的东西只有许多 ID。当我尝试各种不同的事情时,我只是得到一个“新列会在现有列之后留下孔”错误。谢谢,到目前为止,您的解决方案帮了大忙!
    • 这告诉我你正在使用带有错误索引的replace()。不清楚你想要什么。尝试在一个新问题中给出一个最小的示例,并添加您尝试过但不起作用的代码。确保你链接到这个。
    【解决方案2】:

    这是另一种方法。首先将全部转换为零,然后将第一个零转换回NA

    > x <- c(NA,NA,NA,1,2,3,NA,NA,4,5,NA)
    > x[which(is.na(x))] <- 0
    ### index from 1 to first element before the first element >0
    > x[1:min(which(x>0))-1] <- NA
    > x
     [1] NA NA NA  1  2  3  0  0  4  5  0
    

    还有

    ### end of vector (elements are >0)
    > endOfVec <- min(which(x>0)):length(x)
    > x[endOfVec][is.na(x[endOfVec])] <- 0
    [1] NA NA NA  1  2  3  0  0  4  5  0
    

    【讨论】:

      猜你喜欢
      • 2015-11-05
      • 2023-03-13
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多