R:使用apply在split字符串中搜索

时间:2014-08-12 20:13:16

标签: regex r strsplit

在一个大型数据框中,我有一个包含字符串的列,例如" 1安培; 27&安培; 32"代表代码的组合。我希望拆分列中的每个元素,搜索特定代码(例如" 1"),如果该元素确实包含感兴趣的代码,则返回行号。我正在思考以下几点:

apply(df["MEDS"],2,function(x){x.split<-strsplit(x,"&")if(grep(1,x.split)){return(row(x))}})

但我无法弄清楚从哪里开始,因为这给了我错误:

Error in apply(df["MEDS"], 2, function(x) { : 
  dim(X) must have a positive length

非常感谢任何更正或建议,谢谢!

1 个答案:

答案 0 :(得分:0)

我在这里看到了一些问题(除了函数中缺少分号)。

  1. df["MEDS"]写得更准确df[,"MEDS"]。这是一个专栏。 apply()意味着对矩阵的每个列/行进行操作,就像它们是向量一样。如果您想在单个列上操作,则不需要apply()

  2. strsplit()返回向量列表。由于您一次将其应用于一行,因此列表将具有一个元素(即字符向量)。因此,您应该通过索引列表元素strsplit(x,"&")[[1]]来提取该向量。

  3. 如果函数的输入是矩阵或知道它来自哪一行,则返回row(x)。它不是。 apply()将拉出每一行并将其作为向量传递给您的函数,因此row(x)将失败。

  4. 也可能存在其他问题。我没有让它完全运行。

    正如我所提到的,你根本不需要apply()。你真的只需要查看1列。你甚至不需要拆分它。

    OneRows <- which(grepl('(^|&)1(&|$)', df$MEDS))
    
    正如马修建议的那样。或者,如果您打算将数据框子集化,

    newdf <- df[grepl((^|&)1(&|$)', df$MEDS),]