2015-11-06 86 views
2

我有两个数据表具有相同的尺寸 - 一个用数字填充,另一个用可以是正数或负数的符号。乘以R中的数字和符号

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")); 

,需要乘双方的elementwise:

resultMatrix = data.table(colOne = c("-a","3b","-4c"), 
          colTwo = c("d","0","-f")) 

"-e*0"也是可以接受的,而不是"0"的结果colTwo),并没有办理环它的价格是不能确定如何做到这一点很多时间用于较大的表格。做这件事的正确方法是什么?

+0

您是否正在使用'ryacas'软件包?我从来没有,但它是“R符号数学”的第一个命中,它看起来非常有前途。 – Gregor

+0

不,但我听说过,如果没有快速回答,肯定会试一试。谢谢你的提示。 – Dement

回答

1

这可能是使用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 
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 Rhttps://stackoverflow.com/questions/16862801/trouble-mapping-vectors-arrays-into-polynomials-that-return-vector,但他们似乎没有回答涉及多个varialbe名称的特定问题,虽然我特别推荐观看'mpoly'套餐。

+0

非常有趣。在现有的后续“后处理”步骤中,“-1 * a”,“-0 * e”等应该变成“-a”,“0”,因此两个答案都应该起作用,现在只需要检查其中运作最快。感谢@TheTime,BondedDust – Dement