【问题标题】:Inserting delimiter before nth uppercase letter in R string在R字符串中的第n个大写字母之前插入分隔符
【发布时间】:2015-11-06 21:41:24
【问题描述】:

我目前有一个导入的 CSV 数据的数据框。它是名字和姓氏、职位和公司名称的列表。每个条目位于单独的行上。名字和姓氏、职位和公司名称都大写。

每一行都是这种格式:

First LastTitle, Company

我想在“标题”之前插入一个逗号分隔符,这样我就可以将数据分成三列,就像这个问题的第二个答案:splitting comma separated mixed text and numeric string with strsplit in R

本质上,在这种特定情况下,我想在每个字符串中找到第三个大写字母,然后在它之前插入一个逗号分隔符。

这个答案显示了如何在大写字母上拆分字符串,但似乎只能找到第一个大写字母:Splitting String based on letters case

欢迎提出任何建议。

【问题讨论】:

    标签: r string


    【解决方案1】:

    将字符串拆分成字符向量,然后用grep查找大写字母的位置,取第三个位置。

    str <- "First LastTitle, Company"
    tmp_str <- unlist(strsplit(str, ""))
    ind <- grep("[A-Z]", tmp_str)[3]
    paste0(c(tmp_str[1:(ind-1)], ",", tmp_str[ind:nchar(str)]), collapse="")
    #[1] "First Last,Title, Company"
    

    【讨论】:

    • 这很好用。如果我有一个 3000 行数据框,那么在每一行上运行它的最快方法是什么?我会将每一行转换为字符向量吗?
    • 您可以使用 apply(df, 1, function(row) ... )。这将一个函数应用于名为 df 的数据帧的每一行。
    • 我对如何将 apply() 与 unlist 函数一起使用感到困惑。 df2 = apply(df,1,unlist(strsplit(df, ""))) 似乎不起作用,df2 = apply(df,1,unlist(row(df,""))) 也不起作用返回:"Error in strsplit(row, "") : non-character argument"。我可以将上述两个步骤合并到一个 apply() 函数中吗?
    • @ceph 第三个参数采用一个函数,因此在您的情况下,您可能需要 `df2
    • 好的,我现在明白了“函数”是按字面意思使用的。我的数据在单列中。不过,当我运行您的代码时,我得到了:Error in strsplit(str, "") : non-character argument。我清除了我的环境,并再次使用 read.csv 加载了 csv,但没有运气。
    【解决方案2】:

    你可以在一个大写几个非大写字符的两个模式之后插入一个逗号:

    x <- "First LastTitle, Company"
    
    sub("(([A-Z][^A-Z]+){2})(.*)","\\1,\\3",x)
    [1] "First Last,Title, Company"
    

    【讨论】:

      【解决方案3】:

      试试这个:

      gsub('([a-z])(?=[A-Z])','\\1,',str,perl=T)
      [1] "First Last,Title, Company"
      

      【讨论】:

      • 如何将它与 apply() 一起使用?我是否必须将每一行转换为字符串?
      猜你喜欢
      • 2022-07-02
      • 2016-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-29
      • 2023-02-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多