如何逐行删除数据框中的NA变量

时间:2018-01-12 12:34:58

标签: r dplyr vegan

这是我的数据框:

 structure(list(Q = c(NA, 346.86, 166.95, 162.57, NA, NA, NA, 
        266.7), L = c(18.93, NA, 15.72, 39.51, NA, NA, NA, NA), C = c(NA, 
        23.8, NA, 8.47, 20.89, 18.72, 14.94, NA), X = c(40.56, NA, 26.05, 
        3.08, 23.77, 59.37, NA, NA), W = c(29.47, NA, NA, NA, 36.08, 
        NA, 27.34, 28.19), S = c(NA, 7.47, NA, NA, 18.64, NA, 25.34, 
        NA), Y = c(NA, 2.81, 0, NA, NA, 21.18, 10.83, 12.19), H = c(0, 
        NA, NA, NA, NA, 0, NA, 0)), class = "data.frame", row.names = c(NA, 
        -8L), .Names = c("Q", "L", "C", "X", "W", "S", "Y", "H"))

每行有4个NAs变量,现在我想对每一行执行相同的操作:

  1. 删除那些NAs
  2. 的4个变量
  3. 计算其余4个变量的多样性(这只是与其余变量有关的一些计算,我在diversity()使用vegan
  4. 将输出附加到新数据框
  5. 但问题是:

    1. 如何使用dplyr删除NA变量?我不知道select()是否可以成功。
    2. 如何将操作应用于数据框的每一行?
    3. 似乎drop_na()会删除我的数据集的整行,有什么建议吗?

1 个答案:

答案 0 :(得分:2)

使用tidyversegather进入“长期”可能会更好。格式,然后spread回来。假设我们每行恰好有4个非NA元素,请使用rownames_to_column(从tibble),gather(从tidyr)创建一个行索引到'长'格式,删除NA元素,按行号分组(''),更改'键'将值设为常用值,然后将spread设置为广义值'格式

library(tibble)
library(tidyr)
library(dplyr)
res <- rownames_to_column(df1, 'rn') %>% 
      gather(key, val, -rn) %>% 
      filter(!is.na(val)) %>% 
      group_by(rn) %>%  
      mutate(key = LETTERS[1:4]) %>%
      spread(key, val) %>%
      ungroup %>%
      select(-rn)
res
# A tibble: 8 x 4
#      A     B     C     D
#* <dbl> <dbl> <dbl> <dbl>
#1  18.9  40.6 29.5   0   
#2 347    23.8  7.47  2.81
#3 167    15.7 26.0   0   
#4 163    39.5  8.47  3.08
#5  20.9  23.8 36.1  18.6 
#6  18.7  59.4 21.2   0   
#7  14.9  27.3 25.3  10.8 
#8 267    28.2 12.2   0   

diversity(res)
#      1         2         3         4         5         6         7         8 
#1.0533711 0.3718959 0.6331070 0.7090783 1.3517680 0.9516232 1.3215712 0.4697572 

关于diversity计算,我们可以replace NA为0并应用于整个数据集,即

library(vegan)
diversity(replace(df1, is.na(df1), 0))
#[1] 1.0533711 0.3718959 0.6331070 0.7090783
#[5] 1.3517680 0.9516232 1.3215712 0.4697572

因为我们获得与第一个解决方案相同的输出