Skip to content

remove NAs from list collectively

7 messages · Dimitris Rizopoulos, Johannes Radinger, Jorge I Velez +1 more

#
Hi,

I am importing dataframe from an Excel file (xlsx package).
The columns contain acutally measurements for single species and
the column-length is of variable. As it is imported as a dataframe the difference to the "longest" column is filled with NA.
To explain it with an example, my dataframe looks like:

A <- seq(1:10)
B <- c(seq(1:5),rep(NA,5))
C <- c(seq(1:7),rep(NA,3))

df <- data.frame(A,B,C)


Now I'd like to transform that to a list of vectors of different length. Therefore I need to remove the NAs collectively from the single columns...I tried for transforming:

as.list(df)

...but I don't know how can I remove the NAs now? as.list doesn't take na.rm=TRUE argument. Is there any ready function to perform such tasks?
Or is there a better way then to assign the data to a list of vectors with variable length?

/johannes
--
#
Two possibilities are:

lapply(df, function (x) x[!is.na(x)])

and

lapply(df, na.exclude)


I hope it helps.

Best,
Dimitris
On 2/8/2012 11:54 AM, Johannes Radinger wrote:

  
    
#
Hi,

lapply(df, function (x) x[!is.na(x)])
thats is really great!

Thank you!

-------- Original-Nachricht --------
--
#
Hi,
I want to "melt" my list and get certain deskriptive factors (length of a vector etc.) into a dataframe. Best to describe it with an example:

A <- seq(4)
B <- seq(6)
C <- seq(9)

ls <- list(A,B,C) # this is my list with vectors of different length

# thats the dataframe how it should look like:
name	length(x)	length(x[x>5])	length(x[x<5])	
A	4	0	4
B	6	1	4
C	9	4	4

How can that be achieved?


/johannes
--
#
Hi,
thank you...the sapply approach seems straight forward, although I don't get the names into an own column... When the list elements are named the name is used for the rownames. I'd like to have them as an own column and no row names...

like for the list:
list <- list(A=1:4, B=1:6, C=1:9)
t(sapply(list, function(x) c(length(x), sum(x > 5), sum(x < 5))))

/Johannes
--
#
Does this do what you want:
+     data.frame(name = x
+         , length = length(list[[x]])
+         , gt5 = sum(list[[x]] > 5)
+         , lt5 = sum(list[[x]] < 5)
+         )
+ })
name length gt5 lt5
1    A      4   0   4
2    B      6   1   4
3    C      9   4   4
On Wed, Feb 8, 2012 at 10:18 AM, Johannes Radinger <JRadinger at gmx.at> wrote: