0

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

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

4

1 回答 1

0

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

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

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

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

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

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

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

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

newdf <- df[grepl((^|&)1(&|$)', df$MEDS),]
于 2014-08-13T00:52:55.323 回答