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 NA
s 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))