【发布时间】:2012-05-14 09:08:50
【问题描述】:
我有一个包含 95 列的数据框,并且想用简单的正则表达式批量重命名其中的很多,比如底部的 sn-p,有大约 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] 翻译表”,我发现 xlate。 grep/sub/gsub 文档中的任何地方都没有提到。
base/gsubfn/data.table等中是否有任何内容可以让我编写一个搜索和替换指令? (如字典或翻译表)您能否改进我笨拙的语法,使其成为对 tr 的引用调用? (不得创建整个 df 的临时副本)
EDIT2:阅读后我最大的努力是:
字典方法 (xlate) 可能是部分答案,但这不仅仅是一个简单的翻译表,因为正则表达式必须是终端(例如 '_14$')。 p>
我可以使用 gsub() 或 strsplit() 在 '_' 上拆分,然后对最后一个组件进行 xlate 翻译,然后 paste() 将它们重新组合在一起。寻找更简洁的 1/2 行成语。
否则我只使用 gsub()s 的墙。
【问题讨论】:
标签: regex r dataframe batch-rename