Julia中类似于R的paste()函数的等效函数是什么?

10
有没有 Julia 中的函数类似于 R 的 paste() 函数?特别地,如果我们给函数两个向量,它将返回一个单一的向量,其中包含两个输入向量的逐元素连接。我已经查看了文档或其他地方,但似乎找不到答案。John Myles White 的旧帖子表明 Julia 的 join() 函数是最接近的类比,但它似乎仅适用于字符串对,而不是字符串向量的逐元素操作。目前,我只是使用下面的函数循环调用 join() 来处理元素,但我想知道是否有更好的方法。
x = ["aa", "bb", "cc"]
y = ["dd", "ee", "ff"]

function mypaste(v1, v2)
    n = length(v1)
    res = Array{ASCIIString}(n)
    for i = 1:n
        res[i] = join([v1[i], v2[i]])
    end
    return res
end

mypaste(x, y)

运行mypaste()会得到如下输出,与预期相符。
3-element Array{ASCIIString,1}:
 "aadd"
 "bbee"
 "ccff"

有没有好的替代方案?我是否误解了join()函数?

3个回答

12

我认为我不会使用joinjoin用于在一个集合内组合字符串;而你需要的是跨两个不同集合的字符串连接。因此,虽然使用zip创建join所需的临时集合很容易(也很高效),但你可以通过使用string函数或乘法来避免它:

julia> map(string, x, y)
3-element Array{ASCIIString,1}:
 "aadd"
 "bbee"
 "ccff"

julia> map(*, x, y)
3-element Array{ASCIIString,1}:
 "aadd"
 "bbee"
 "ccff"

更好的方法(但也许聪明过头了),是使用逐元素广播乘法运算符.*

julia> x .* y
3-element Array{ASCIIString,1}:
 "aadd"
 "bbee"
 "ccff"

但这在R中将是paste0()函数。你如何使map函数在“aa”和“dd”之间放置一个空格? - Jorge Paredes
我使用了 x.*" ".*y,但我仍然想知道如何使用 map 函数实现。 - Jorge Paredes
1
@JorgeParedes,“map”要求其所有参数的大小相同。您可以使用broadcast(*,x,“ ”,y)来执行与上面的“.*”版本相同的操作。 - mbauman

4

map可以使用。一行代码是map(join,zip(x,y))。如下例所示,它还添加了z

julia> x = ["aa","bb","cc"];

julia> y = ["dd","ee","ff"];

julia> z = ["gg","hh","ii"];

julia> map(join,zip(x,y,z))
3-element Array{Any,1}:
 "aaddgg"
 "bbeehh"
 "ccffii"

(请参考@DSM的答案,了解列表推导式)

4
你可以使用列表推导和zip来获取这些对:
julia> x = ["aa", "bb", "cc"];

julia> y = ["dd", "ee", "ff"];

julia> [join(i) for i=zip(x,y)]
3-element Array{ByteString,1}:
 "aadd"
 "bbee"
 "ccff"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接