Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

How to change the class of a column in a list of a list from character to numeric in r?

The codes for producing sample dataset and converting from character to numeric is as below:

ff = data.frame(a = c('1','2','3'),b = 1:3, c = 5:7)
#data.frame is a type of list.

fff = list(ff,ff,ff,ff)

k = fff %>% map(~map(.x,function(x){x['a'] %<>% as.numeric
  return(x)}))

However, the result is something like this…:
There are 3 lists appear in each of the nested list ==> 33 = 9, which is very strange.
I think the result should have 3 lists in a nested list.==> 3
1 = 3

what I want is to convert every a in each dataframe to be numeric.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

> k
[[1]]
[[1]]$a
              a 
"1" "2" "3"  NA 

[[1]]$b
          a 
 1  2  3 NA 

[[1]]$c
          a 
 5  6  7 NA 


[[2]]
[[2]]$a
              a 
"1" "2" "3"  NA 

[[2]]$b
          a 
 1  2  3 NA 

[[2]]$c
          a 
 5  6  7 NA 


[[3]]
[[3]]$a
              a 
"1" "2" "3"  NA 

[[3]]$b
          a 
 1  2  3 NA 

[[3]]$c
          a 
 5  6  7 NA 


[[4]]
[[4]]$a
              a 
"1" "2" "3"  NA 

[[4]]$b
          a 
 1  2  3 NA 

[[4]]$c
          a 
 5  6  7 NA 

I cannot understand why I cannot convert a into numeric…

>Solution :

Like this, with mutate:

fff %>% 
  map(~ mutate(.x, a = as.numeric(a)))

Or, more base R style:

fff %>% 
  map(\(x) {x$a <- as.numeric(x$a); x})

You should use map only once, because you don’t have a nested list. With the first map, you access to each dataframe, and then you can convert to numeric. With a second map, you are accessing the columns of each data frame (which you don’t want).

With two maps, it’s also preferable to use \ or function rather than ~ because it becomes confusing to use .x and x for different objects. In your question, .x is the dataframe, while x are columns of it.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading