我需要根据来自数组的多个条件从Julia数据框中的单个列中选择值。上下文:我正在尝试格式化来自大型Julia DataFrame的数据以支持PCA(主成分分析),因此我首先将原始数据拆分为解析矩阵和标签数组。到目前为止,这是我的代码(无效):
.as-console-wrapper { max-height: 100% !important; top: 0; }
output> MethodError:没有匹配的方法...
在### Initialize source dataframe for PCA
dfSource=DataFrame(
colDataX=[0,5,10,15,5,20,0,5,10,30],
colDataY=[1,2,3,4,5,6,7,8,9,0],
colRowLabels=[0.2,0.3,0.5,0.6,0.0,0.1,0.2,0.1,0.8,0.0])
### Extract 1/2 of rows into analytical matrix
matSource=convert(Matrix,DataFrame(dfSource[1:2:end,1:2]))'
### Extract last column as labels
arLabels=dfSource[1:2:end,3]
### Select filtered rows
datGet=matSource[:,arLabels>=0.2 & arLabels<0.7][1,:]
print(datGet)
语句之前的最后一行,我得到一个MethodError,指示与print(datGet)
逻辑的使用有关的方法不匹配。我做错了什么?
答案 0 :(得分:2)
替代实现的一个小示例(也许您会发现查看DataFrames.jl内置的内容很有用):
# avoid materialization if dfSource is large
dfSourceHalf = @view dfSource[1:2:end, :]
lazyFilter = Iterators.filter(row -> 0.2 <= row[3] < 0.7, eachrow(dfSourceHalf))
matFiltered = mapreduce(row -> collect(row[1:2]), hcat, lazyFilter)
matFiltered[1, :]
(这不是针对速度进行优化的,而是作为展示可能的方法,但仍然比您的代码快几倍)
答案 1 :(得分:1)
此代码有效:
&
输出> [0,10,0]
请注意使用括号dfSource=DataFrame(
colDataX=[0,5,10,15,5,20,0,5,10,30],
colDataY=[1,2,3,4,5,6,7,8,9,0],
colRowLabels=[0.2,0.3,0.5,0.6,0.0,0.1,0.2,0.1,0.8,0.0])
matSource=convert(Matrix,DataFrame(dfSource[1:2:end,1:2]))'
arLabels=dfSource[1:2:end,3]
datGet=matSource[:,(arLabels.>=0.2) .& (arLabels.<0.7)][1,:]
print(datGet)
和(arLabels.>=0.2)
,以及使用(arLabels<0.7)
和.>=
语法(这会强制Julia遍历容器/采集)。最后,也是最关键的一点(因为这是大多数人所缺少的部分),请注意使用.<
代替.&
。点运算符使一切变得不同!