我有两个具有相同尺寸的数据表 - 一个填充数字,另一个填充可以是正数或负数的符号,例如。
A = data.table(colOne = c(-1, 3, 4),
colTwo = c(1, 0, -1));
B = data.table(colOne = c("a","b","-c"),
colTwo = c("d","-e","f"));
并且需要按元素相乘:
resultMatrix = data.table(colOne = c("-a","3b","-4c"),
colTwo = c("d","0","-f"))
("-e*0"
也可以接受而不是"0"
in colTwo
结果)并且我不确定如何在不经历循环的情况下执行此操作,这对于较大的表来说会花费大量时间。这样做的正确方法是什么?
这可能是一个使用的机会gsubfn
。它的工作原理就像gsub
除非您可以将函数应用于替换。功能f
这里捕获第一组中的所有数字和“-”,第二组中的字符。然后强制转换为数字,利用唯一失败的情况是尾随“-”的事实。
library(gsubfn)
## Function to pass to gsubfn (use backref to get reference to orignal string)
## x is original string, y is first group (numbers), z is last (characters)
f <- function(x, y, z) {
n <- as.numeric(y)
if(is.na(n)) n <- as.numeric(substr(y, 1, nchar(y)-1))*-1 # case: [-]\\d+-
if (n == 0) return( '0' )
if (n == 1) return( z )
if (n == -1) return( paste0("-", z) )
return( paste0(n, z) )
}
A[, lapply(1:ncol(A), function(i) suppressWarnings(
gsubfn('([-\\d]+)(.*)', f, paste0(A[[i]], B[[i]]), backref=2))) ]
# V1 V2
# 1: -a d
# 2: 3b 0
# 3: -4c -f
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)