在一个大型数据框中,我有一个包含字符串的列,例如" 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
非常感谢任何更正或建议,谢谢!
答案 0 :(得分:0)
我在这里看到了一些问题(除了函数中缺少分号)。
df["MEDS"]
写得更准确df[,"MEDS"]
。这是一个专栏。 apply()
意味着对矩阵的每个列/行进行操作,就像它们是向量一样。如果您想在单个列上操作,则不需要apply()
strsplit()
返回向量列表。由于您一次将其应用于一行,因此列表将具有一个元素(即字符向量)。因此,您应该通过索引列表元素strsplit(x,"&")[[1]]
来提取该向量。
如果函数的输入是矩阵或知道它来自哪一行,则返回row(x)
。它不是。 apply()
将拉出每一行并将其作为向量传递给您的函数,因此row(x)
将失败。
也可能存在其他问题。我没有让它完全运行。
正如我所提到的,你根本不需要apply()
。你真的只需要查看1列。你甚至不需要拆分它。
OneRows <- which(grepl('(^|&)1(&|$)', df$MEDS))
正如马修建议的那样。或者,如果您打算将数据框子集化,
newdf <- df[grepl((^|&)1(&|$)', df$MEDS),]