【问题标题】:Split string and store in data frame拆分字符串并存储在数据框中
【发布时间】:2018-01-03 13:55:15
【问题描述】:

我有一个字符数组,如下。

char[1:3] .   
 [1] "ByShubham SharmaTOP 500 REVIEWERon 12 November 2017"   
 [2] "ByJitender Bhatiaon 16 November 2017"                
 [3] "ByMridul K.on 15 August 2017"                        

我希望输出为

Name Badge Date
---------------
Shubham Sharma . TOP 500 REVIEWER   12 November 2017  
Jitender Bhatia   NA                16 November 2017                
Mridul K15        NA .              August 2017                       

【问题讨论】:

  • 这是您的全部数据吗?如果没有,您的字符串中是否有任何可识别的结构可以使用正则表达式进行评估?
  • @LAP 是的,这是我的全部数据。如问题中所述,可能只有两种类型的字符串(请参阅字符列表中的 1 和 2 )。我面临的问题是字符串的分离,因为要分离的单词是在没有任何空格的情况下连接起来的(例如 By、TOP、on)

标签: r string dataframe split


【解决方案1】:

假设:

  • 输入与最后的注释一样
  • 将删除每行开头的By
  • 输入始终以:digits month numbers 结尾
  • 一个小写字母紧跟一个大写字母,此时将被分成两个字段
  • on 前面紧跟的非小写字符应删除
  • 没有分号

我们插入分号分隔字段并删除Byon,最后使用带有分号分隔符的read.table将其读入。

ss0 <- sub("By(.*) (\\d+ \\S+ \\d{4})$", "\\1;\\2", s)  # insert ; before date
ss1 <- sub("([^a-z])on", "\\1 ", ss0)   # remove 'on' if not after lower
ss2 <- sub("^(.*[a-z])([A-Z].*)", "\\1;\\2", ss1) # insert ; between lower & upper
ss3 <- sub("^([^;]*);([^;]*)$", "\\1;NA;\\2", ss2) # ; to ;NA; if only 2 fields
read.table(text = ss3, sep = ";", as.is = TRUE, strip.white = TRUE,
  col.names = c("Name", "Badge", "Date"))

给予:

               Name            Badge             Date
1    Shubham Sharma TOP 500 REVIEWER 12 November 2017
2 Jitender Bhatiaon             <NA> 16 November 2017
3         Mridul K.             <NA>   15 August 2017

这适用于示例代码,但您可能必须根据整个数据集的整个规则对其进行修改。

如果输入很短,另一种可能性是手动编辑输入,删除Byon,并在字段之间适当插入分号。然后使用上面的read.table 语句。

注意

s <- c( "ByShubham SharmaTOP 500 REVIEWERon 12 November 2017",
"ByJitender Bhatiaon 16 November 2017",
"ByMridul K.on 15 August 2017")

更新: (1) 稍微修改规则并相应编码。 (2) 化简。

【讨论】:

  • 谢谢@Grothendieck。这是一个很大的帮助。
【解决方案2】:

只有三行,我宁愿从头开始编写数据框:

df <- data.frame(Name = c("Shubham Sharma", "Jitender Bhatia", "Mridul K."),
                 Badge = c("TOP 500 REVIEWER", NA, NA),
                 Date = c(as.Date("2017-11-12"), as.Date("2017-11-16"), as.Date("2017-08-15")),
                 stringsAsFactors = F))

> df
             Name            Badge       Date
1  Shubham Sharma TOP 500 REVIEWER 2017-11-12
2 Jitender Bhatia             <NA> 2017-11-16
3       Mridul K.             <NA> 2017-08-15

【讨论】:

    猜你喜欢
    • 2017-03-07
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多