我有一个包含 95 列的数据框,并且想用简单的正则表达式批量重命名其中的很多,就像底部的代码段一样,有大约 30 行这样的行。任何其他与搜索正则表达式不匹配的列都必须保持不变。
**** 示例:names(tr) = c('foo', 'bar', 'xxx_14', 'xxx_2001', 'yyy_76', 'baz', 'zzz_22', ...) ****
我从一堵 25 gsub()s 的墙开始 - 粗略但有效:
names(tr) <- gsub('_1$', '_R', names(tr))
names(tr) <- gsub('_14$', '_I', names(tr))
names(tr) <- gsub('_22$', '_P', names(tr))
names(tr) <- gsub('_50$', '_O', names(tr))
... yada yada
@Joshua:mapply 不起作用,结果证明它更复杂且无法矢量化。names(tr) 包含其他列,当这些模式确实发生时,您不能假设它们都发生了,更不用说按照我们定义它们的确切顺序了。因此,尝试 2 是:
pattern <- paste('_', c('1','14','22','50','52','57','76','1018','2001','3301','6005'), '$', sep='')
replace <- paste('_', c('R','I', 'P', 'O', 'C', 'D', 'M', 'L', 'S', 'K', 'G'), sep='')
do.call(gsub, list(pattern, replace, names(tr)))
Warning messages:
1: In function (pattern, replacement, x, ignore.case = FALSE, perl = FALSE, :
argument 'pattern' has length > 1 and only the first element will be used
2: In function (pattern, replacement, x, ignore.case = FALSE, perl = FALSE, :
argument 'replacement' has length > 1 and only the first element will be used
谁能帮我解决这个问题?
编辑:我阅读了关于这个主题的所有 SO 和 R 文档,但找不到任何东西......然后当我发布它时,我想搜索 '[r] translation table' 并找到xlate。grep/sub/gsub文档中的任何地方都没有提到。
有什么东西
base/gsubfn/data.table
可以让我写一个搜索和替换指令吗?(如字典或翻译表)你能把我笨拙的语法改进为对 tr 的引用调用吗?(不得创建整个 df 的临时副本)
EDIT2:阅读后我最大的努力是:
字典方法(xlate)可能是部分答案,但这不仅仅是一个简单的翻译表,因为正则表达式必须是终端(例如'_14$')。
我可以使用gsub()或strsplit()在 '_' 上拆分,然后在最后一个组件上进行xlate翻译,然后将它们粘贴在一起。寻找更干净的 1/2 行成语。
否则我只使用gsub()s 的墙壁。