字符列的 Col Min() 和 Col Max()我對一個類似於 Col Min()/Col Max() 的函數感興趣,包括允許對變量進行分組;但它不是對數字列進行操作,而是對字符列進行操作。 例如:
- “Col Min Str( :Data, :Grouping)”將返回 :Data 中按字母順序排列的第一個條目,並按 :Grouping 分組。
- “Col Max Str(:Data, :Grouping)”將返回 :Data 中按字母順序排列的最後一個條目,並按 :Grouping 分組。
有想法嗎?
回复:字符列的 Col Min() 和 Col Max()兩位回复者-謝謝-我將驗證此解決方案並回复您
問題是它是否可以處理約 70k 行以及多長時間?
順便說一句,我在 AWS 實例上使用非常非常強大的(RAM、SSD)機器......
回复:字符列的 Col Min() 和 Col Max()這是另一個使用我最喜歡的數學屬性的解決方案。
Names default to here(1);
dt = open("$SAMPLE_DATA\Big Class.jmp");
l = :name << Get Values;
r = rank(l);
rr = rank(r);
dt << new Column("Order", <<SET values=""></SET>
它的運作方式完全基於等級。
列表的排名將給出對原始列表進行子集化以獲得有序列表所需的順序。
l = {"B", "D", "C", "A"};
r = rank(l);
// r = [4, 1, 3, 2]
// l[r] = {"A", "B", "C", "D"}
一個很酷的想法是,如果你對一個rank()進行排序,當用於為排序列表添加下標時,它會給你將其返回到原始列表所需的順序。
rr = rank(r);
// rr = [2, 4, 3, 1]
// l[r][rr] = {"B", "D", "C", "A"}
希望這有效。
回复:字符列的 Col Min() 和 Col Max()Col Max Str() 函數是通用函數。它適用於傳遞給它的任何字符數據。下面是它在示例數據表上的用法
names default to here(1);
dt=New Table( "Untitled 2",
Add Rows( 8 ),
New Column( "Try",
Character,
"Nominal",
Set Values( {"A", "A", "A", "B", "B", "C", "C", "C"} )
),
New Column( "Why",
Character,
"Nominal",
Set Values( {"1A", "2C", "2D", "3B", "2F", "1S", "1W", "1R"} )
)
);
dt << New Column( "Max Why by Try",
Character,
Nominal,
Formula(
Col Max Str = Function( {data, by},
dt = Current Data Table();
testBy = Column( dt, by )[Row()];
rr = dt << get rows where( as column(dt, by) == testBy );
myList = As List( Column( dt, data )[rr] );
myList = Sort List( myList );
myList[N Items( myList )];
);
result = Col Max Str( "Why", "try" );
)
);回复:字符列的 Col Min() 和 Col Max()吉姆,
這個jsl可以更通用嗎?
例如下表
嘗試為什麼
1A
2C
二維
乙3B
B 2F
1S
1W
1R
我想獲得每次嘗試的最大“為什麼”,即
二維
乙3B
1W
回复:字符列的 Col Min() 和 Col Max()@約翰_馬登,您的回复讓我開始了解 Eval(Parse()) 方法的使用。這是一種強大但令人困惑的方法。所以我再次查看了代碼,通過使用 As Column() 函數,可以刪除整個 Eval(Parse()) 內容
names default to here(1);
dt=open("$SAMPLE_DATA/big class.jmp");
dt << New Column( "Max Name by Sex",
Character,
Nominal,
Formula(
Col Max Str = Function( {data, by},
dt = Current Data Table();
testBy = Column( dt, by )[Row()];
rr = dt << get rows where( as column(dt, by) == testBy );
myList = As List( Column( dt, data )[rr] );
myList = Sort List( myList );
myList[N Items( myList )];
);
result = Col Max Str( "Name", "Sex" );
)
);回复:字符列的 Col Min() 和 Col Max()使用 Eval(Parse()) 方法,只需將 JSL 語句構建為文字字符串,然後執行它們。當 JMP 無法正確解釋語句時,我有時會使用此選項。我最初嘗試以這種形式提出相關陳述
rr = dt << get rows where( Column( dt, by ) == testBy );
JMP 不喜歡這樣......或者更確切地說,JMP 沒有像我想像的那樣解釋這一點。如果採用明確的形式,該聲明確實有效
rr = dt << get rows where( :sex == "F" );
因此,通過將該特定行生成為文字字符串並使用 Eval(Parse()) 組合函數,它可以生成我想要的代碼的精確顯式形式,然後執行它
Eval(Parse(
"rr = dt << get rows where( :" || by || " == \!"" || testBy ||"\!" );"
)
);
回复:字符列的 Col Min() 和 Col Max()吉姆,
謝謝,這似乎工作得很好。 它確實解決了我的問題。
但你能說一下嗎如何有用? 它看起來很有趣,而且我不熟悉這種風格,特別是 Eval ( Parse … ) 子句的作用。
乾杯,約翰
回复:字符列的 Col Min() 和 Col Max()我認為這提供了你想要的
names default to here(1);
dt=open("$SAMPLE_DATA/big class.jmp");
dt << New Column( "Max Name by Sex",
Character,
Nominal,
Formula(
Col Max Str = Function( {data, by},
dt = Current Data Table();
testBy = Column( dt, by )[Row()];
Eval(
Parse(
"rr = dt << get rows where( :" || by || " == \!"" || testBy ||
"\!" );"
)
);
myList = As List( Column( dt, data )[rr] );
myList = Sort List( myList );
myList[N Items( myList )];
);
result = Col Max Str( "Name", "Sex" );
)
);
dt << New Column( "Min Name by Sex",
Character,
"Nominal",
Formula(
Col Min Str = Function( {data, by},
dt = Current Data Table();
testBy = Column( dt, by )[Row()];
Eval(
Parse(
"rr = dt << get rows where( :" || by || " == \!"" || testBy ||
"\!" );"
)
);
myList = As List( Column( dt, data )[rr] );
myList = Sort List( myList );
myList[1];
);
result = Col Min Str( "Name", "Sex" );
)
);