SusannaB
SusannaB

Reputation: 85

Searching for a way to replace elements of character vectors in a list

I have a list of character vectors of different length, containing identifiers (e.g. "011" or "12"), numbers indicating the amount of money ("112.3" or "490.5") and years ("2011" or "2020"), empty elements ("") and elements only containing a dot("."). I want to get rid of the elements of character vectors that only contain a dot or are empty. The leading zeros of the identifiers are important, so I cannot change the type to numeric.

This original data

l <- list(c("2015","2016"),c(""),c("."), c("0","2418.9","292.4"),c("2",".",".","2394.6"),c("011","","934.0","1200.7"))

should look like this:

l_final <- list(c("2015","2016"),c("0","2418.9","292.4"),c("2","2394.6"),c("011","934.0","1200.7"))

My idea is to create a list with TRUE/FALSE indicating for each vector which elements to keep, but right now I'm really stuck as the following approach does not work (it returns integers that are zero) :

test <- lapply(list, function(i) {unlist(lapply(list[i], function(b) which(b==".")))})

Regarding the expression for ".", I already tried other regular expressions like "\." and "[.]".

Upvotes: 2

Views: 49

Answers (2)

jpsmith
jpsmith

Reputation: 17240

A two-step solution doubling down on lapply, if needed/as an alternative:

# data
l <- list(c("2015","2016"),c(""),c("."), c("0","2418.9","292.4"),c("2",".",".","2394.6"))

# remove those with "." or ""
l2 <- lapply(l, function(x) {x[!(x %in% c(".", ""))]})

# remove empty list positions
l2[lapply(l2, length) > 0]

#[[1]]
#[1] "2015" "2016"

#[[2]]
#[1] "0"      "2418.9" "292.4" 

#[[3]]
#[1] "2"      "2394.6"

Upvotes: 2

akrun
akrun

Reputation: 887213

We could loop over the list, subset the elements that are not . or "" and Filter out the list elements that are empty

Filter(length, lapply(list, function(x) x[! x %in% c(".", "")]))

-output

[[1]]
[1] "2015" "2016"

[[2]]
[1] "0"      "2418.9" "292.4" 

[[3]]
[1] "2"      "2394.6"

Upvotes: 3

Related Questions