【问题标题】:How to separate data with 5 question marks separator using separate()?如何使用separate()用5个问号分隔符分隔数据?
【发布时间】:2016-11-05 07:26:54
【问题描述】:

嘿,所以我有一个带有 head() 的小标题,如下所示:

# A tibble: 6 × 1
                                   id.make.model.year
                                             <chr>
1  27550?????AM General?????DJ Po Vehicle 2WD?????1984
2  28426?????AM General?????DJ Po Vehicle 2WD?????1984
3   27549?????AM General?????FJ8c Post Office?????1984
4   28425?????AM General?????FJ8c Post Office?????1984
5 1032?????AM General?????Post Office DJ5 2WD?????1985
6 1033?????AM General?????Post Office DJ8 2WD?????1985

只有一列。我想用这四个列名将它分成四列。我尝试使用separate()

A %>% 
  separate(id.make.model.year,into=c("id","make"),sep="?????")

A %>% 
  separate(id.make.model.year,into=c("id","make"),sep="\\?????")

但它们都返回以下错误:

stringi::stri_split_regex(value, sep, n_max) 中的错误: 正则表达式模式中的语法错误。 (U_REGEX_RULE_SYNTAX)

再试一次……:

A %>% 
  separate(id.make.model.year,into=c("id","make"),sep="[?????]")

返回

# A tibble: 33,439 × 2
      id  make
*  <chr> <chr>
1  27550      
2  28426      
3  27549      
4  28425      
5   1032      
6   1033      
7   3347      
8  13309      
9  13310      
10 13311      
# ... with 33,429 more rows
Warning message:
Too many values at 33439 locations: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ... 

我也尝试删除 sep,但所有空格都清楚地算作分隔符。

这样做的正确方法是什么?提前致谢。

【问题讨论】:

  • 请在您的问题中添加dput(head(df)) 的输出,使其成为reproducible example。无论如何,这对我来说只是一个简单的正则表达式问题。
  • 匹配一个问号的正则表达式是\?,或[?]。但是,如果您有五个,[?????] 仍然只有一个匹配该字符的出现,就像 [aaaaa] 只匹配一个字母 a,而不是五个。所以我认为你想要\?{5}[?]{5}(或\?\?\?\?\?[?][?][?][?][?])。在您使用dput() 发布数据之前,我无法确认。
  • 顺便说一句,如果'?????'来自 read.csv() 的 Unicode 编码错误或奇怪的分隔符,您可能需要修复它。

标签: r regex separator tidyr


【解决方案1】:

匹配一个问号的正则表达式是\?,或[?]。但是,如果您有五个,[?????] 仍然只有一个匹配该字符的一次出现,因为[...] 定义了一个字符类。就像[aaaaa] 只会匹配一个字母a,而不是五个。

所以要捕获五个重复,我认为您需要\?{5}[?]{5}(或\?\?\?\?\?[?][?][?][?][?])。

在您使用dput() 发布数据之前,我无法确认。

【讨论】:

  • 非常感谢您使用您建议的方法!
【解决方案2】:

这里是splitstackshapedata.table 软件包的一种解决方案。您使用cSplit() 拆分列。由于您需要四列,因此您想在函数中指定direction = "wide"。创建四列后,您要更改列名。我使用strsplit() 拆分了原始列名,并创建了四个您想要的名称。

library(splitstackshape)
library(data.table)

mydf <- data.frame(id.make.model.year = c("27550?????AM General?????DJ Po Vehicle 2WD?????1984",
                                          "28426?????AM General?????DJ Po Vehicle 2WD?????1984"),
                   stringsAsFactors = F)

temp <- cSplit(mydf, splitCols = "id.make.model.year", sep = "?????", direction = "wide")
setnames(temp, unlist(strsplit(names(mydf), "[.]")))


#      id       make             model year
#1: 27550 AM General DJ Po Vehicle 2WD 1984
#2: 28426 AM General DJ Po Vehicle 2WD 1984

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    • 2021-03-01
    • 1970-01-01
    • 2019-09-23
    • 2018-03-10
    • 2020-12-04
    相关资源
    最近更新 更多