String 函数在两个不等向量笛卡尔积上的应用

String 函数在两个不等向量笛卡尔积上的应用,string,r,kernel,apply,kernlab,String,R,Kernel,Apply,Kernlab,我试图通过使用一个有文档记录的apply函数来避免循环,但未能找到任何适合我的目的的示例。我有两个向量,x是(1 x p)和y是(1 x q),我想把它们的参数的笛卡尔积输入一个函数,下面是一个简单的例子: require(kernlab) x = c("cranapple", "pear", "orange-aid", "mango", "kiwi", "strawberry-kiwi", "fruit-punch", "pomegranate")

我试图通过使用一个有文档记录的apply函数来避免循环,但未能找到任何适合我的目的的示例。我有两个向量,x是(1 x p)和y是(1 x q),我想把它们的参数的笛卡尔积输入一个函数,下面是一个简单的例子:

    require(kernlab)
    x = c("cranapple", "pear", "orange-aid", "mango", "kiwi", 
           "strawberry-kiwi", "fruit-punch", "pomegranate")
    y = c("apple", "cranberry", "orange", "peach")

    sk <- stringdot(type="boundrange", length = l, normalized=TRUE)
    sk_map = function(x, y){return(sk(x, y))}
require(内核实验室)
x=c(“红果蔓”、“梨”、“橙汁”、“芒果”、“猕猴桃”,
“草莓猕猴桃”、“水果潘趣酒”、“石榴”)
y=c(“苹果”、“蔓越莓”、“橘子”、“桃子”)

sk这就是你的想法:

sk <- stringdot(type="boundrange", length = 2, normalized=TRUE)

# Create data frame with every combination of x and y
dat = expand.grid(x=x,y=y)

# Apply sk by row
sk_map = apply(dat, 1, function(dat_row) sk(dat_row[1],dat_row[2]))

sk如果函数已矢量化,则可以使用
outer
函数进行此操作,如果未矢量化,则可以使用
Vectorize
函数创建矢量化函数

outer(x,y,FUN=sk)


apply
仅在
x
y
的数据类型相同(或者可以强制它们相同)时才起作用。更一般的情况是
mapply(fn,dat[[1]],dat[[2]])
在这种情况下,函数将比较字符串以匹配子字符串,因此我认为这在这里不会有问题(例如,如果一列是因子或字符,而另一列是数字,则函数可以正常工作),但这对于以后的参考是很好的,在这种情况下,它会起作用。但由于问题的标题提出了一个更普遍的解决方案,我想确保这也包括在内。我对这两个答案进行了基准测试,这种方法似乎对我需要使用的数据量具有优势。非常感谢。
outer(x,y, FUN=Vectorize(sk))