字符列的 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() 的一个 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
二维
乙 3乙
地下二楼
1S
1W
1R
我想每次尝试获得最大的“为什么”,即
二维
乙 3乙
1W
回复:字符列的 Col Min() 和 Col Max()@john_madden ,您的回复让我开始了解 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" );
)
);