【问题标题】:select column in data frame based on NAs in rows根据行中的 NA 在数据框中选择列
【发布时间】:2012-06-09 00:16:20
【问题描述】:

假设我有一个 7 列的数据框,其中一些行有 7 个值,而另一些行的 NA 超过了某个点。我想获取不是 NA 的最后一个值(从左到右),然后直接获取左侧的值。它是分层数据,但有些组比其他组更深入。我想要新数据框中两列中最深和第二深的组。

此代码有效,但将我的内存用于 46K 观察的数据帧。有没有我没有想到的更有效的方法?

df <- data.frame(LEVEL1 = c('animal', 'vegetable', 'mineral'),
                 LEVEL2 = c('mammal', 'pepper', 'rock'),
                 LEVEL3 = c('dog', 'jalepeno', NA),
                 LEVEL4 = c('westie', NA, NA))

deepest <- apply(df, 1, 
                  function(x) length(which(!is.na(x))))
one.up <- apply(df, 1, 
                    function(x) length(which(!is.na(x)))-1)
len <- nrow(df)
output <- data.frame(one.up = unlist(sapply(1:len, 
                            function(x) df[x, one.up[x]])),
                     deepest= unlist(sapply(1:len, 
                                            function(x) df[x, deepest[x]])))

第一次发帖。通常我可以从这个站点拼凑出我需要的东西。提前致谢。

【问题讨论】:

    标签: r hierarchy na


    【解决方案1】:

    我认为您可以通过简单的apply 调用来节省运行该循环两次,例如:

    > apply(df, 1, function(x) {
    +     n <- max(which(!is.na(x)))
    +     x[(n-1):n]
    + })
         [,1]     [,2]       [,3]     
    [1,] "dog"    "pepper"   "mineral"
    [2,] "westie" "jalepeno" "rock"   
    

    【讨论】:

      【解决方案2】:

      如果 NA 可能散布在行的长度中(尽管您说这不应该发生),我不确定您的代码是否会提供您认为应该的内容。此代码将在第一个 NA 之前停止并返回两个先验值。

      > output.m <- apply(df,1,function(x) { leng.na <-rle(is.na(x))$lengths[1]
                                             tail(x[1:leng.na],2) }  )
      > output.d <- as.data.frame(t(output.m))
      > output.d
             V1       V2
      1     dog   westie
      2  pepper jalepeno
      3 mineral     rock
      

      【讨论】:

      • 非常感谢。我很确定我的数据没有“内部”NA,但我不知道 rle 函数。这会派上用场的。
      猜你喜欢
      • 2021-07-23
      • 2018-08-11
      • 2015-12-16
      • 1970-01-01
      • 2014-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-05
      相关资源
      最近更新 更多