【问题标题】:R: searching within split character strings with applyR:使用apply在拆分字符串中搜索
【发布时间】:2014-08-12 20:13:15
【问题描述】:

在一个大型数据框中,我有一列包含字符串,例如“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

任何更正或建议将不胜感激,谢谢!

【问题讨论】:

  • 你也可以grepl('(^|&amp;)1(&amp;|$)', x)
  • 另外,由于问题要求提供行号,您可以使用which(grepl('(^|&amp;)1(&amp;|$)', df$MEDS))

标签: regex r strsplit


【解决方案1】:

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

  1. df["MEDS"] 写成df[,"MEDS"] 更正确。它是单列。 apply() 旨在对矩阵的每一列/行进行操作,就好像它们是向量一样。如果要对单列进行操作,则不需要apply()

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

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

可能还有其他问题。我没有让它完全运行。

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

OneRows <- which(grepl('(^|&)1(&|$)', df$MEDS))

正如马修建议的那样。或者,如果您的意图是对数据框进行子集化,

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

【讨论】:

  • 谢谢!刚开始学习所以,除了解决方案,您的更正真的很有帮助。
猜你喜欢
  • 2020-01-27
  • 1970-01-01
  • 1970-01-01
  • 2015-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多