【发布时间】:2019-03-13 17:12:18
【问题描述】:
考虑一个示例数据集:
dt <- data.table(data.frame(V1 = c("C1/R3","M2/R4")))
> dt
V1
1: C1/R3
2: M2/R4
对于dt 的每一行,我想提取连接的字符 C、M 或 R。例如,
dt[,V2 := stri_join_list(str_match_all(V1,"[CMR],sep="",collapse=""),by=seq_len(nrow(dt))]
> dt
V1 V2
1: C1/R3 CR
2: M2/R4 MR
但是,我有 4200 万行,上面的代码还不够高效。有没有办法在不使用逐行操作的情况下做到这一点?当我跳过 by 参数时,我会为每一行获得条目 CRMR。
【问题讨论】:
-
这些不是矢量化函数,因此您不需要
by=? -dt[,V2 := stri_join_list(str_match_all(V1,"[CMR]"))]- 我不确定你是如何得到NA值的,但你可能希望在你的示例中包含一个这样做的行。 -
您能否澄清一下,在您的真实数据中:1)所有的字母都是大写的吗? 2) 模式是否始终只是 1 个字母后跟一个数字,然后是 / 后跟 1 个字母,后跟一个数字 - 如果不是,请指定字母和数字的重复长度,例如任何长度?因为效率对您很重要,包括这些细节将有助于防止过度概括(可能较慢)的解决方案,或者避免过度简化的解决方案(作为一个公平的假设)正确解决您提出的问题。
-
@thelatemail,将其矢量化实际上会从所有行组合中返回 [CMR]。 IE,两个条目都是“CRMR”。
-
@krads,更新示例。
-
@hipHopMetropolisHastings - 使用我建议的矢量化代码有效。根据更新前的原始
dt,它为第一行提供CR,为第二行提供MR。您需要删除代码中的collapse=""(而不是我的代码)。
标签: r string data.table