我有两个具有相同尺寸的数据表 - 一个用数字填充,另一个用符号可以是正数或负数,例如
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"
中的colTwo
,并且不确定如何在不经历循环的情况下执行此操作,这会花费大量时间来处理更大的表。这样做的正确方法是什么?
答案 0 :(得分:1)
这会让你接近:所有剩下的就是将减号移动到字符串的LHS:
mapply(paste, A, B, MoreArgs=list(sep='*') )
colOne colTwo
[1,] "-1*a" "1*d"
[2,] "3*b" "0*-e"
[3,] "4*-c" "-1*f"
使用sub
在第二部分的示例中最终确定了这项工作:
> res[] <- sapply(res , function(x) sub("(.*)([-])(.*)", "\\2\\1\\3", x) )
> res
colOne colTwo
[1,] "-1*a" "1*d"
[2,] "3*b" "-0*e"
[3,] "-4*c" "-1*f"
在我写这篇文章之前,我查了几个我认为可能类似的问题:How to represent polynomials with numeric vectors in R和https://stackoverflow.com/questions/16862801/trouble-mapping-vectors-arrays-into-polynomials-that-return-vector,但他们似乎没有回答涉及多个变种名称的特定问题,虽然我特别推荐查看&amp; mpoly&#39; -package。
答案 1 :(得分:1)
这可能是使用zoom
的机会。它的作用类似于gsubfn
,除了您可以将函数应用于替换。此处的函数gsub
会捕获所有数字和&#39; - &#39;在第一组中,第二组中的字符。然后强制使用数字,利用这一事实,即唯一失败的情况是尾随&#34; - &#34;。
f