如何拆分列并将第一个拆分值保留为代表值

时间:2017-10-10 07:30:02

标签: r regex dplyr

我有以下数据框


library(tidyverse)
#> + ggplot2 2.2.1.9000        Date: 2017-10-10
#> + tibble  1.3.4                R: 3.3.2
#> + tidyr   0.7.1               OS: macOS Sierra 10.12.6
#> + readr   1.1.1              GUI: X11
#> + purrr   0.2.3           Locale: en_US.UTF-8
#> + dplyr   0.7.3               TZ: Asia/Tokyo
#> + stringr 1.2.0           
#> + forcats 0.2.0
#> ── Conflicts ────────────────────────────────────────────────────
#> * filter(),  from dplyr, masks stats::filter()
#> * lag(),     from dplyr, masks stats::lag()

DF <- data.frame(V1=c("Place1-Place2-Place2-Place4-Place2-Place3-Place5",
                      "Place7",
                      "Place6-Place6",
                      "Place1-Place2-Place3-Place4"), 
                 V2=c(100,200,500,10)) %>% 

      as.tibble()


DF 
#> # A tibble: 4 x 2
#>                                                 V1    V2
#>                                             <fctr> <dbl>
#> 1 Place1-Place2-Place2-Place4-Place2-Place3-Place5   100
#> 2                                           Place7   200
#> 3                                    Place6-Place6   500
#> 4                      Place1-Place2-Place3-Place4    10

我想要做的是将V1拆分为&#34; - &#34;并选择第一个使用第一个拆分值作为V1的新值。导致:

   V1       V2                      
   Place1   100
   Place7   200
   Place6   500
   Place1    10

我坚持这个:

as.data.frame(str_split_fixed(DF$V1, "-",8))
      V1     V2     V3     V4     V5     V6     V7 V8
1 Place1 Place2 Place2 Place4 Place2 Place3 Place5   
2 Place7                                             
3 Place6 Place6                                      
4 Place1 Place2 Place3 Place4

2 个答案:

答案 0 :(得分:3)

我们可以使用separate中的tidyrextra="merge",之后只保留感兴趣的列

library(tidyr)
separate(DF, V1, into = c("V1", "Extra"), extra = "merge") %>% 
               select(-Extra)

或使用正则表达式

DF %>%
    mutate(V1 =  sub("-.*", "", V1))
# A tibble: 4 x 2
#      V1    V2
#   <chr> <dbl>
#1 Place1   100
#2 Place7   200
#3 Place6   500
#4 Place1    10

答案 1 :(得分:2)

以下是基础R的解决方案:

DF <- data.frame(V1=c("Place1-Place2-Place2-Place4-Place2-Place3-Place5",
                      "Place7",
                      "Place6-Place6",
                      "Place1-Place2-Place3-Place4"), 
                 V2=c(100,200,500,10))
DF$V1 <- sub("-.*", "", DF$V1)
DF
# > DF
#       V1  V2
# 1 Place1 100
# 2 Place7 200
# 3 Place6 500
# 4 Place1  10