2

I have the following dataset:

Class      Range      Value
A          6 - 8      19
B          1 - 3      14
C          5 - 16     10
D          4 - 7      5

I want to split the range for each class into two columns. To do that, I used the function str_split_fixed as the following:

merge(data, str_split_fixed(data[, 2], " - ", 2))

and I even tried:

merge(data, str_split_fixed(data$Range, " - ", 2))

But both of them give me the following results:

Class      Range      Value    V1     V2
A          6 - 8      19       6      8
B          1 - 3      14       6      8
C          5 - 16     10       6      8
D          4 - 7      5        6      8

My question is, why does it repeat the first range for the rest of the classes? Can someone help?

zx8754
  • 52,746
  • 12
  • 114
  • 209
Adam Amin
  • 1,406
  • 2
  • 11
  • 23

1 Answers1

0

The output of str_split_fixed is a two column matrix (no dimnames), and when we do a merge with out specifying the column name, it does a cross join. Instead of merge, we could use a cbind or assign to two columns

data[c('V1', 'V2')] <- str_split_fixed(data[, 2], " - ", 2)

NOTE: The output of str_split are elements with character type. It may need to converted to numeric


An easier option is separate

library(tidyverse)
data %>%
    separate(Range, into = c("V1", "V2"), convert = TRUE)
#   Class V1 V2 Value
#1     A  6  8    19
#2     B  1  3    14
#3     C  5 16    10
#4     D  4  7     5

akrun
  • 874,273
  • 37
  • 540
  • 662