I have a simple dataframe as such:
ID Col1 Col2 Col3 Col4
1 NA NA NA NA
1 5 10 NA NA
1 NA NA 15 20
2 NA NA NA NA
2 25 30 NA NA
2 NA NA 35 40
And I would like to reformat it as such:
ID Col1 Col2 Col3 Col4
1 5 10 15 20
2 25 30 35 40
(please note: the real data set has thousands of rows and the values are from biological data -- the NA
s follow no simple pattern, except that the NA
s are disjoint, and yes there are exactly 3 rows for each ID
).
STEP ONE: get rid of rows that have only NA
values.
On the surface this looked simple, but I've run across some problems.
complete.cases(DF)
returns all FALSE
, so I can't really use this to remove the rows with all NA
s, as in DF[complete.cases(DF),]
. This is because all rows contain at least one NA
.
Since NA
s want to propagate themselves, other schemes using is.na
fail for the same reason.
STEP TWO: collapse the remaining two rows into one.
Thinking about using something like aggregate
to pull this off, but there has got to be an easier way than this, which doesn't work at all.
Thanks for any advice.
To remove all rows having NA, we can use na. omit function. For Example, if we have a data frame called df that contains some NA values then we can remove all rows that contains at least one NA by using the command na. omit(df).
To check which value in NA in an R data frame, we can use apply function along with is.na function. This will return the data frame in logical form with TRUE and FALSE.
In R, the easiest way to find columns that contain missing values is by combining the power of the functions is.na() and colSums(). First, you check and count the number of NA's per column. Then, you use a function such as names() or colnames() to return the names of the columns with at least one missing value.
Here's a data table approach that uses na.omit()
across the columns, grouped by ID.
library(data.table)
setDT(df)[, lapply(.SD, na.omit), by = ID]
# ID Col1 Col2 Col3 Col4
# 1: 1 5 10 15 20
# 2: 2 25 30 35 40
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With