我的dataframe - split.(df2.name)中有一个数组。
> 392-element Array{Array{SubString{String},1},1}:
["chevrolet", "chevelle", "malibu"]
["buick", "skylark", "320"]
["plymouth", "satellite"]
["amc", "rebel", "sst"]
["ford", "torino"]
⋮
["ford", "mustang", "gl"]
["vw", "pickup"]
["dodge", "rampage"]
["ford", "ranger"]
["chevy", "s-10"] 我想选择每个数组的第一个元素以外的所有元素,并将它们连接在一起,以获得这些汽车的模型名称。
首先,我想这样做:model = join.(split.(df2.name)[2:end], " "),但不是删除每个数组的第一个元素,而是删除第一个car (外部数组的第一个元素)。
所以我想把范围[2:end]广播给所有的元素,方法是在距离前点:model = join.(split.(df2.name).[2:end], " ")。但这似乎也不起作用,因为存在语法错误:
syntax: missing last argument in "2:" range expression那么,在这种情况下,朱利安用什么方式来广播一个范围呢?
发布于 2020-08-23 13:36:11
在这里使用普通广播似乎有点棘手,因为正如您所发现的,构建2:end范围会显式地导致语法错误。我认为这是因为这样的表达方式
a[2:end]被特别分析并降低到
a[2:lastindex(a)]正如lastindex文档中所解释的那样。
但是,您可以使用像Iterators.drop这样的迭代器来遍历除第一个元素之外的所有元素,这是一个可以广播的操作:
julia> cars = [["chevrolet", "chevelle", "malibu"],
["buick", "skylark", "320"],
["plymouth", "satellite"],
["amc", "rebel", "sst"],
["ford", "torino"]];
julia> join.(Iterators.drop.(cars, 1), " ")
5-element Array{String,1}:
"chevelle malibu"
"skylark 320"
"satellite"
"rebel sst"
"torino"但我认为,在这种情况下,我可能会进行理解,我认为这将是更易读的:
julia> [join(car[2:end], " ") for car in cars]
5-element Array{String,1}:
"chevelle malibu"
"skylark 320"
"satellite"
"rebel sst"
"torino"
编辑:回顾了您的全球问题,它似乎您首先比您想要的split更多,然后挣扎join返回您最初不想分裂的部分。
因此,您可能希望利用limit关键字参数到split,这样您就不会首先拆分太多的单词:
julia> cars2 = ["chevrolet chevelle malibu",
"buick skylark 320",
"plymouth satellite",
"amc rebel sst",
"ford torino"];
julia> split.(cars2, " ", limit=2)
5-element Array{Array{SubString{String},1},1}:
["chevrolet", "chevelle malibu"]
["buick", "skylark 320"]
["plymouth", "satellite"]
["amc", "rebel sst"]
["ford", "torino"]
julia> getindex.(split.(cars2, " ", limit=2), 2)
5-element Array{SubString{String},1}:
"chevelle malibu"
"skylark 320"
"satellite"
"rebel sst"
"torino"最后一个示例还演示了如何通过显式getindex(a, i)函数调用来广播索引语法,该函数调用是语法糖a[i]的降低形式。
发布于 2020-08-23 13:33:10
通常,广播索引语法的工作方式是将其转换为getindex并广播如下:
model = join.(getindex.(split.(df2.name), Ref(2:10)), " ")需要Ref将范围作为标量来处理;您也可以使用一个1元组。
这是最简单的部分。但是,这个技巧在end中的使用变得很难看,因为在括号外它没有任何意义,这是您得到错误的原因。解决此问题的一种方法是将end替换为lastindex,但是您可能应该缓存数组计算:
model = let nameparts = split.(df2.name)
join.(getindex.(nameparts, Ref(2:lastindex(nameparts))), " ")
end然而,这就失去了广播融合的优势。
在这种特殊情况下,您也可以使用Iterators.rest,因为我们知道Array迭代器是如何工作的:
join.(Iterators.rest.(split.(df2.name), 2), " ")但在我看来,最简单的版本只是一种理解:
model = [join(split(carname)[2:end]) for carname in df2.name](除非你对Iterators非常熟悉。那么我个人更喜欢上一个。)
https://stackoverflow.com/questions/63546933
复制相似问题