Here is an option using separate
and purrr::map_dfc
library(tidyverse)
map_dfc(df, ~as.tibble(.x) %>% separate(value, c("val", "err")))
## A tibble: 3 x 6
# val err val1 err1 val2 err2
# <chr> <chr> <chr> <chr> <chr> <chr>
#1 76 2 76 2 76 2
#2 78 2 76 2 76 2
#3 10 2 76 2 76 2
I leave renaming the columns up to you.
Update
In response to your comment, you can use sep
inside separate
to specify the character(s) by which to separate columns.
df <- read.table(text =
"X1 X2 X3
A '76.23 ± 2.23' '76 ± 2' '76 ± 2'
B '78.34 ± 2.23' '76 ± 2' '76 ± 2'
C '10.64 ± 2.23' '76 ± 2' '76 ± 2'", header = T)
library(tidyverse)
map_dfc(df, ~as.tibble(.x) %>% separate(value, c("val", "err"), sep = " ± "))
## A tibble: 3 x 6
# val err val1 err1 val2 err2
# <chr> <chr> <chr> <chr> <chr> <chr>
#1 76.23 2.23 76 2 76 2
#2 78.34 2.23 76 2 76 2
#3 10.64 2.23 76 2 76 2
Update 2
To include rownames as a separate column
map_dfc(df, ~as.tibble(.x) %>% separate(value, c("val", "err"), sep = " ± ")) %>%
mutate(row = rownames(df))
## A tibble: 3 x 7
# val err val1 err1 val2 err2 row
# <chr> <chr> <chr> <chr> <chr> <chr> <chr>
#1 76.23 2.23 76 2 76 2 A
#2 78.34 2.23 76 2 76 2 B
#3 10.64 2.23 76 2 76 2 C
To include rownames as rownames
map_dfc(df, ~as.tibble(.x) %>% separate(value, c("val", "err"), sep = " ± ")) %>%
data.frame(row.names = rownames(df))
# val err val1 err1 val2 err2
#A 76.23 2.23 76 2 76 2
#B 78.34 2.23 76 2 76 2
#C 10.64 2.23 76 2 76 2
Sample data
df <- read.table(text =
"X1 X2 X3
A '76 ± 2' '76 ± 2' '76 ± 2'
B '78 ± 2' '76 ± 2' '76 ± 2'
C '10 ± 2' '76 ± 2' '76 ± 2'", header = T)