【问题标题】:Split String In R Based On Character Location基于字符位置在R中拆分字符串
【发布时间】:2016-11-20 12:03:10
【问题描述】:

我正在尝试将 R 中的这些字符串(列条目)拆分为三个单独的列:

João Moutinho Monaco, 30,  M(C) 
Clinton N'Jie Marseille, 23,  FW
Frederic Sammaritano Dijon, 30,  AM(LR)

成为

Player                Team           Pos
João Moutinho         Monaco         30,  M(C) 
Clinton N'Jie         Marseille      23,  FW
Frederic Sammaritano  Dijon          30,  AM(LR)

我可以使用 gregexpr 和 nchar 找到字符的位置,但我不确定如何使用 strsplit。或者也许另一个包更容易?

【问题讨论】:

  • 乌萨马什么时候入党的?
  • 哎呀大卫,已编辑!

标签: r strsplit


【解决方案1】:

在使用gsub 创建分隔符后,我们可以使用read.csv 将向量读入data.frame

read.csv(text=gsub("^(\\S+\\s+\\S+)\\s+(\\S+),\\s+(.*)", 
       "\\1;\\2;\\3", v1), sep=";", header=FALSE, 
       col.names = c("Player", "Team", "Pos"), stringsAsFactors=FALSE)
#                Player      Team         Pos
#1        João Moutinho    Monaco   30,  M(C)
#2        Clinton N'Jie Marseille     23,  FW
#3 Frederic Sammaritano     Dijon 30,  AM(LR)

更新

如果我们有更多模式并且“团队”名称只有一个单词(即在第一个 ',' 之前)

read.csv(text= sub("(\\s+[A-Za-z]+),(\\s+\\d+),(.*)", ";\\1;\\2\\3", v2), 
      header=FALSE, sep=";", col.names = c("Player", "Team", "Pos"), stringsAsFactors=FALSE)
#                Player       Team         Pos
#1        João Moutinho     Monaco    30  M(C)
#2        Clinton N'Jie  Marseille      23  FW
#3 Frederic Sammaritano      Dijon  30  AM(LR)
#4       Angel Di María        PSG   28 M(CLR)
#5    Jean Michael Seri       Nice     25 M(C)

数据

v1 <- c("João Moutinho Monaco, 30,  M(C)", "Clinton N'Jie Marseille, 23,  FW", 
                    "Frederic Sammaritano Dijon, 30,  AM(LR)")
v2 <- c(v1, "Angel Di María PSG, 28, M(CLR)","Jean Michael Seri Nice, 25, M(C)")

【讨论】:

  • 谢谢,这很有帮助!但是,如果玩家的名字中有超过 3 个或更多的单词,我会遇到问题。整个字符串在第一列(播放器)中结束......我一直在尝试更改正则表达式但没有运气。
  • @ClattyCake 是的,它特定于您展示的模式。我以为你只有一个模式,因为示例只显示了一个模式
  • 啊,对,它分解为这样的字符向量:c("Angel Di María PSG, 28, M(CLR)","Jean Michael Seri Nice, 25, M(C)")等。有没有办法更改正则表达式,以便如果名称中有 3 个或更多单词,那么它会在播放器列中识别它?如果有帮助,球队名称在第一个逗号之前将只有一个字符串(例如“PSG”、“Saint-Etienne”、“Marseille”)。对不起,错误信息!
【解决方案2】:

来自stringrword 方法,

library(stringr)
data.frame(Player = word(v1, 1, 2), 
             Team = sub(',','' ,word(v1, 3)), 
              Pos = word(v1, 4, 6), stringsAsFactors = FALSE)

#                Player      Team         Pos
#1        João Moutinho    Monaco   30,  M(C)
#2        Clinton N'Jie Marseille     23,  FW
#3 Frederic Sammaritano     Dijon 30,  AM(LR)

【讨论】:

    最近更新 更多