1

I'm very, very new to R, and I have some data from quiz scores that is stored as strings like "2.00 / 2" or "0.00 / 2," and I'm trying to turn them into numeric types so that I can do operations on them. How does one apply a functions like gsub() and as.numeric() to all the data (except the first column, which has participants' names)?

ezrudel
  • 13
  • 2
  • `df[-1] <- lapply(df[-1], as.numeric)` – Sotos Jun 15 '21 at 13:58
  • 2
    It would be easier to help if you create a small reproducible example along with expected output. Read about [how to give a reproducible example](http://stackoverflow.com/questions/5963269). – Ronak Shah Jun 15 '21 at 14:00

2 Answers2

0

You can see how to evaluate text expressions here Evaluate expression given as a string.

In your case I would first create a function to evaluate a vector and then define which vectors to evaluate using across().

library(tidyverse)
example_df <- data.frame(
  name = c("John", "David"),
  answer1 = c("2 / 5", "10 / 2"),
  answer2 = c("1 / 3", "5 + 4")
)

evaluate_expression <- function(vec){
  vec %>% 
    map(~ parse(text = .)) %>% 
    map_dbl(eval)
}

example_df %>% 
  mutate(across(c(answer1, answer2), evaluate_expression))

#    name answer1   answer2
# 1  John     0.4 0.3333333
# 2 David     5.0 9.0000000
yogevmh
  • 316
  • 1
  • 5
  • Thanks so much! I've added the following to my code: `format_col <- function(col){ col %>% map(~ parse(1,text = .)) %>% map_dbl(eval) } pre = pre %>% transmute(Nombre=Nombre, across(starts_with("X"),format_col))` but I'm still getting this error: Error: Problem with `mutate()` input `..2`. i `..2 = across(starts_with("X"), format_col)`. x Result 28 must be a single double, not NULL of length 0 sorry this is so messy - is there a way to do formatting in comments on this thing? – ezrudel Jun 16 '21 at 17:18
0

My friend helped me out and I eventually got it to work like this:

format_col = function(var){
  as.numeric(str_sub(var,1,1)) /
    as.numeric(str_sub(var,8,8))
}

df = df %>% transmute(Nombre=Nombre,
                      across(starts_with("X"),
                             format_col))
ezrudel
  • 13
  • 2