【问题标题】:Splitting column into multiple columns by separator通过分隔符将列拆分为多列
【发布时间】:2018-03-17 05:42:04
【问题描述】:

我有一个带有“罪行”列的 data.frame。每项罪行都由一个条款(Art)、一个段落(Abs)和一个分段(Ziff)组成:

df<-data.frame(offence=c("Art. 110 Abs. 3 StGB","Art. 10 Abs. 1 StGB", "Art. 122 SVG", "Art. 1 Ziff. 2 UWG"))

> df
               offence
1 Art. 110 Abs. 3 StGB
2  Art. 10 Abs. 1 StGB
3         Art. 122 SVG
4   Art. 1 Ziff. 2 UWG

但我需要以这种形式:

  Art Ziff Abs  Law
1 110   NA   3 StGB
2  10   NA   1 StGB
3 122   NA  NA  SVG
4   1    2  NA  UWG

获得此结果的最佳方法是什么?应用?

谢谢!

【问题讨论】:

    标签: r split tidyr strsplit


    【解决方案1】:

    您可以从stringr 使用str_extract

    library(stringr)
    library(dplyr)
    
    df$offence %>%
      {data.frame(Art = str_extract(., "(?<=Art[.]\\s)\\d+"),
                  Ziff = str_extract(., "(?<=Ziff[.]\\s)\\d+"),
                  Abs = str_extract(., "(?<=Abs[.]\\s)\\d+"),
                  Law = str_extract(., "\\w+$"))}
    

    结果:

      Art Ziff  Abs  Law
    1 110 <NA>    3 StGB
    2  10 <NA>    1 StGB
    3 122 <NA> <NA>  SVG
    4   1    2 <NA>  UWG
    

    【讨论】:

      【解决方案2】:

      使用gsub 将其转换为dcf 形式(即关键字:值),然后使用read.dcf 将其读入。最后将read.dcf 生成的矩阵转换为数据框,并将任意数字列转换为数字。没有使用任何包。

      s <- gsub("(\\S+)[.] (\\d+)", "\\1: \\2\n", df[[1]]) # convert to keyword: value
      s <- sub(" (\\D+)$", "Law: \\1\n\n", s) # handle Law column
      us <- trimws(unlist(strsplit(s, "\n")))  # split into separate components
      DF <- as.data.frame(read.dcf(textConnection(us)), stringsAsFactors = FALSE)
      DF[] <- lapply(DF, type.convert)
      

      给予:

        Art Abs  Law Ziff
      1 110   3 StGB   NA
      2  10   1 StGB   NA
      3 122  NA  SVG   NA
      4   1  NA  UWG    2
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-13
        • 2019-09-23
        • 2021-12-10
        • 2021-03-05
        • 1970-01-01
        • 2019-05-11
        相关资源
        最近更新 更多