How to move up all columns in a dataframe in R?

I have a dataframe that looks like this…

C_array D_array E_array
20.000    NA        NA
0.000     NA        NA
0.000     NA        NA
  NA      17.000    NA
  NA      17.000    NA
  NA      21.000    NA
  NA      49.000    NA
  NA      52.000    NA
  NA      NA      31.000
  NA      NA      31.000
  NA      NA      32.000
  NA      NA      32.000
  NA      NA      34.000
  NA      NA      34.000
  NA      NA      34.000
  NA      NA      34.000
  NA      NA      34.000

How can I remove the leading NA values? I want it to look like this…

C_array D_array E_array
20.000   17.000  31.000
0.000    17.000  31.000
0.000    21.000  32.000
  NA     49.000  32.000
  NA     52.000  34.000
  NA      NA     34.000
  NA      NA     34.000
  NA      NA     34.000
  NA      NA     34.000

>Solution :

We could rearrange the NAs in each column so that the non-NA elements will be ordered before the NA and then subset the rows by removing rows having all NA values

df2 <- df1
df2[] <- lapply(df2, function(x) x[order(is.na(x))])
df2[rowSums(is.na(df2)) < ncol(df2),]

-output

 C_array D_array E_array
1      20      17      31
2       0      17      31
3       0      21      32
4      NA      49      32
5      NA      52      34
6      NA      NA      34
7      NA      NA      34
8      NA      NA      34
9      NA      NA      34

or do this in tidyverse

library(dplyr)
df1 %>%
    mutate(across(everything(), ~ .[order(is.na(.))])) %>% 
    filter(!if_all(everything(), is.na))
  C_array D_array E_array
1      20      17      31
2       0      17      31
3       0      21      32
4      NA      49      32
5      NA      52      34
6      NA      NA      34
7      NA      NA      34
8      NA      NA      34
9      NA      NA      34

data

df1 <- structure(list(C_array = c(20, 0, 0, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA), D_array = c(NA, NA, NA, 17, 
17, 21, 49, 52, NA, NA, NA, NA, NA, NA, NA, NA, NA), E_array = c(NA, 
NA, NA, NA, NA, NA, NA, NA, 31, 31, 32, 32, 34, 34, 34, 34, 34
)), class = "data.frame", row.names = c(NA, -17L))

Leave a Reply