问题
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?
回答1:
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
来源:https://stackoverflow.com/questions/54326623/splitting-a-text-in-one-column-into-many-columns-for-each-row