R语言 将括号中的数字分隔到不同的列中

dsf9zpds  于 2023-02-14  发布在  其他
关注(0)|答案(3)|浏览(179)

根据下面的示例数据,如何将数字分为两个不同的列,即XY
样本数据

Coordinates = c("[-1.74589,6.74885]", NA, NA, NA, NA, "[-1.582775,6.100376]", "[-1.68144,6.63265]", NA, NA, NA, "[-1.98006,6.33484]", "[-0.94156,6.63623]")
df <- data.frame(Coordinates)

预期输出:

Coordinates          X         Y
[-1.74589,6.74885]   -1.74589  6.74885 
NA                   NA        NA
NA                   NA        NA
NA                   NA        NA
NA                   NA        NA
[-1.582775,6.100376] -1.582775 6.100376
[-1.68144,6.63265]   -1.68144  6.63265
NA                   NA        NA
NA                   NA        NA
NA                   NA        NA
[-1.98006,6.33484]   -1.98006  6.33484
[-0.94156,6.63623]   -0.94156  6.6362
at0kjp5o

at0kjp5o1#

您可以使用tidyr::extract

library(tidyr)

df %>%
  extract(Coordinates, into = c('X', 'Y'), regex = "\\[(.+),(.+)\\]", convert = TRUE)

           X        Y
1  -1.745890 6.748850
2         NA       NA
3         NA       NA
4         NA       NA
5         NA       NA
6  -1.582775 6.100376
7  -1.681440 6.632650
8         NA       NA
9         NA       NA
10        NA       NA
11 -1.980060 6.334840
12 -0.941560 6.636230
zy1mlcev

zy1mlcev2#

一个可能的选项是使用tidyr package中的separate()

library(tidyverse)

Coordinates = c("[-1.74589,6.74885]",NA, NA, NA, NA, "[-1.582775,6.100376]", "[-1.68144,6.63265]", NA, NA, NA, "[-1.98006,6.33484]", "[-0.94156,6.63623]")
df = data.frame(Coordinates)

df %>%
  separate(Coordinates, into = c("X", "Y"), sep = ",", remove = FALSE) %>%
  mutate(across(X:Y, ~gsub("\\[|\\]", "", .x)))
#>             Coordinates         X        Y
#> 1    [-1.74589,6.74885]  -1.74589  6.74885
#> 2                  <NA>      <NA>     <NA>
#> 3                  <NA>      <NA>     <NA>
#> 4                  <NA>      <NA>     <NA>
#> 5                  <NA>      <NA>     <NA>
#> 6  [-1.582775,6.100376] -1.582775 6.100376
#> 7    [-1.68144,6.63265]  -1.68144  6.63265
#> 8                  <NA>      <NA>     <NA>
#> 9                  <NA>      <NA>     <NA>
#> 10                 <NA>      <NA>     <NA>
#> 11   [-1.98006,6.33484]  -1.98006  6.33484
#> 12   [-0.94156,6.63623]  -0.94156  6.63623

创建于2023年2月8日,使用reprex v2.0.2
注意:与@ DarrenTsai的extract()方法不同,这不会将“X”和“Y”的类型更改为数值

df %>%
  separate(Coordinates, into = c("X", "Y"), sep = ",", remove = FALSE) %>%
  mutate(across(X:Y, ~gsub("\\[|\\]", "", .x))) %>%
  str()
#> 'data.frame':    12 obs. of  3 variables:
#>  $ Coordinates: chr  "[-1.74589,6.74885]" NA NA NA ...
#>  $ X          : chr  "-1.74589" NA NA NA ...
#>  $ Y          : chr  "6.74885" NA NA NA ...

尽管您可以根据需要将“X”和“Y”更改为数字:

df %>%
  separate(Coordinates, into = c("X", "Y"), sep = ",", remove = FALSE) %>%
  mutate(across(X:Y, ~as.numeric(gsub("\\[|\\]", "", .x)))) %>%
  str()
#> 'data.frame':    12 obs. of  3 variables:
#>  $ Coordinates: chr  "[-1.74589,6.74885]" NA NA NA ...
#>  $ X          : num  -1.75 NA NA NA NA ...
#>  $ Y          : num  6.75 NA NA NA NA ...

创建于2023年2月8日,使用reprex v2.0.2

jchrr9hc

jchrr9hc3#

在较新版本的tidyr中,我们还可以使用separate_wider_regex

library(tidyr)
library(dplyr)
df %>% 
   separate_wider_regex(Coordinates, 
   c("\\[", X = "-?[0-9.]+", ",", Y = "-?[0-9.]+", "\\]"), 
         cols_remove = FALSE) %>% 
   relocate(Coordinates, .before = 1)
  • 输出
# A tibble: 12 × 3
   Coordinates          X         Y       
   <chr>                <chr>     <chr>   
 1 [-1.74589,6.74885]   -1.74589  6.74885 
 2 <NA>                 <NA>      <NA>    
 3 <NA>                 <NA>      <NA>    
 4 <NA>                 <NA>      <NA>    
 5 <NA>                 <NA>      <NA>    
 6 [-1.582775,6.100376] -1.582775 6.100376
 7 [-1.68144,6.63265]   -1.68144  6.63265 
 8 <NA>                 <NA>      <NA>    
 9 <NA>                 <NA>      <NA>    
10 <NA>                 <NA>      <NA>    
11 [-1.98006,6.33484]   -1.98006  6.33484 
12 [-0.94156,6.63623]   -0.94156  6.63623

如果需要转换类型,则在末尾添加%>% type.convert(as.is = TRUE)

相关问题