我开始学习 Julia,我发现
split()
函数有一种奇怪的行为,我不知道如何解决。我正在编写一个脚本来重新格式化 PCA 的输出,并且包含 ID 的第一列压缩了几个字段(大陆、品种和 ID 号)。因此,脚本的第一步是迭代 DataFrame 的这一列,将每个条目拆分两次,并将每个位保存在相应的向量上,以便稍后将它们作为新列添加到数据帧中。问题是,当我尝试这样做时,第一个分割工作正常,但第二个分割只允许我访问第一个条目(breed[1]
),但如果我尝试获取第二个条目(breed[2]
),它会失败消息“错误:BoundsError:尝试访问索引 [2] 处的 1 元素 Vector{SubString{String}}”。但是,当我打印该拆分的输出时,它里面有 2 个项目 SubString{String}["Wild", "Urial"]
。
循环看起来像这样:
for i in ids
newbreed, newid= split(i,":")
pop, breed= split(newbreed,"-")
append!(newids,newid)
append!(newbreeds,breed)
append!(newpops,pop)
end
示例数据可以是:
Europe-Suffolk:Suff123
Asia-Altai:ALY453
Africa-Mbororo:123512
知道是什么导致了这个问题吗?
问题在于使用
append!
,因为本例中的 SubString{String}
具有 Char
的元素,例如
one = []
two = []
for i in ids
one, two = split(i, ":")
end
看看例如
two
collect(two)
6-element Vector{Char}:
'1': ASCII/Unicode U+0031 (category Nd: Number, decimal digit)
'2': ASCII/Unicode U+0032 (category Nd: Number, decimal digit)
'3': ASCII/Unicode U+0033 (category Nd: Number, decimal digit)
'5': ASCII/Unicode U+0035 (category Nd: Number, decimal digit)
'1': ASCII/Unicode U+0031 (category Nd: Number, decimal digit)
'2': ASCII/Unicode U+0032 (category Nd: Number, decimal digit)
append!
尝试添加每个元素。
来自
help?> append!
...将每个 collections 的 elements 添加到其末尾。
在本例中是单个字符。
一种解决方案是使用
push!
,来自 help?> push!
在集合中插入一个或多个项目。
将添加
Char
的整个集合,例如
newids = Vector{String}()
newbreeds = Vector{String}()
newpops = Vector{String}()
for i in ids
newbreed, newid = split(i, ":")
pop, breed = split(newbreed, "-")
push!(newids, newid)
push!(newbreeds, breed)
push!(newpops, pop)
end
newids
3-element Vector{String}:
"Suff123"
"ALY453"
"123512"