【问题标题】:R matrix NA remove from cells [duplicate]R矩阵NA从单元格中删除[重复]
【发布时间】:2021-11-18 09:47:09
【问题描述】:

我对 R 很陌生,我有一个项目,我有一个 df,其中有很多 NA 值。 我的目标是从细胞中去除 NA-s。我的问题是我只找到了删除整行或整列的解决方案。

我的数据框看起来像:

  V1   V2   V3
1 1    2    NA
2 NA   1.1  NA
3 2.1  1    NA
4 3.4  NA   5

等等……

我的目标是得到这样的东西:

    V1    V2   V3
   1 1    2    
   2 1.1  
   3 2.1  1    
   4 3.4  5   

所以基本上我希望我所有的价值观都从同一个位置开始。如果 NA-s 走到尽头,这不是问题,我只需要它让一切都在彼此之下。

到目前为止,我尝试了na.omit(), na.rm and complete.case,但似乎没有一个对我有帮助。

任何帮助将不胜感激!

【问题讨论】:

    标签: r matrix na


    【解决方案1】:

    根据定义,数据框是矩形数据形式,因此您不能删除单个单元格并仍然保留为数据框。在 cmets 中,您指出将 NA 移动到行尾是一个可接受的解决方案。

    您可以使用以下代码将非 NA 值移动到每行的开头:

    df <- data.frame(V1=c(1, NA, 2.1, 3.4), V2=c(2,1.1,1,NA), V3=c(NA,NA,NA,5))
    
    df[] <- t(apply(df,1,function(x) c(x[!is.na(x)],x[is.na(x)])))
    
    #Show output
    df
    #    V1 V2 V3
    # 1 1.0  2 NA
    # 2 1.1 NA NA
    # 3 2.1  1 NA
    # 4 3.4  5 NA
    

    【讨论】:

      【解决方案2】:

      是否只是您希望数据以空格而不是NA打印,如果是这样,那么就可以了:

      tib <- tibble::tribble(
        ~V1,   ~V2,   ~V3,
      1,    2,    NA,
      NA,   1.1,  NA,
      2.1,  1,    NA,
      3.4, NA,   5) %>% as.data.frame()
      
      tib %>% 
        mutate(across(everything(), 
                      ~case_when(is.na(.x) ~ "", 
                                 TRUE ~ as.character(.x)))) %>% 
        noquote(.)
      #    V1  V2 V3
      # 1   1   2   
      # 2     1.1   
      # 3 2.1   1   
      # 4 3.4      5
      

      否则,如果您想这样做,以便 R 中的其他函数以某种方式忽略丢失的数据,那么这将不起作用。

      【讨论】:

      • 我希望我的价值观能够相互调整。就像我在我的任务中写的那样,我的目标是删除 NA 并将值移动到 NA 删除的地方。就像连续有 3 个 NA 和 3 个值一样,我希望有一行以该值开头,而不是 NA 或空格。顺便说一句,这段代码真的很有帮助,在我的其他事情上:)
      猜你喜欢
      • 2011-09-22
      • 2012-11-18
      • 1970-01-01
      • 2014-07-24
      • 2016-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多