获取具有特定截止值的列名你好,
我尝试从这些数据示例中计算并获取特定的列名(我的实际数据包含 180 列和 20000 行)
我想选择截止值 > 1000 的列
| 不。 | A*1:01 | 答:2:01 | 乙*9:02 | 10:01 | DR*56:01 | DP*07_G | 获取名称 |
| 1 | 10.67 | 0 | 9520.23 | 15000.1 | 90.56 | 40.89 | B*9:02,C*10:01 |
| 2 | 0 | 0 | 0 | 0 | 0 | 9.56 | |
| 3 | 9040.3 | 345.3 | 345.9 | 999.9 | 345 | 10.5 | A*1:01 |
| 4 | 34.4 | 4566 | 四十五 | 7 | 0 | 0 | 答:2:01 |
| 5 | 9190.2 | 13567 | 3456 | 6789 | 9088 | 0 | A*1:01,A*2:01,B*9:02,C*10:01,DR*56:01 |
| 6 | 0 | 0 | 0 | 0 | 0 | 0 | |
| ... | | | | | | | |
我尝试了之前的脚本
Names Default To Here( 1 );
// Create a sample data table
dt = New Table( "Example",
Add Rows( 2 ),
New Column( "A*1:01", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 50000] ) ),
New Column( "A*2:01", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 50000] ) ),
New Column( "B*9:02", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 50000] ) ),
New Column( "C*10:01", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 50000] ) ),
New Column( "DR*56:01", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 50000] ) ),
//get wanted columns. Assumes that IMC columns start from column 1 and all IMC columns are one after another
colNames = dt << Get Column Names("String");
For(i = N Items(colNames), i > 3000 , i--,
);
//new column with IMC with value 1
dt << New Column( "Ag", Character,
<< Set Each Value(
rowValues = dt[Row(), 0][1::N Items(colNames)]; //get values of row as matrix
colIndex = Contains(rowValues, 1); //get index of
If(colIndex > 0, //handle
colNames[colIndex], //get column name with the index
""; //when no 1 found use ""
);
);
);您能否修改我的脚本,谢谢!
此外,我可以使用矩阵吗?因为我需要生成 180 列的“新列”。
最好的,
数据混合和清理回复:获取具有特定截止值的列名以下是我的处理方法

names default to here(1);
dt = New Table( "Example",
Add Rows( 6 ),
New Column( "A*1:01",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values(
[10.67, 0, 9040.2999999999993, 34.399999999999999, 9190.2000000000007, 0
]
)
),
New Column( "A*2:01",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [0, 0, 345.30000000000001, 4566, 13567, 0] )
),
New Column( "B*9:02",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [9520.2299999999996, 0, 345.89999999999998, 45, 3456, 0] )
),
New Column( "C*10:01",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [15000.1, 0, 999.89999999999998, 7, 6789, 0] )
),
New Column( "DR*56:01",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [90.560000000000002, 0, 345, 0, 9088, 0] )
),
New Column( "DP*07_G",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [40.890000000000001, 9.5600000000000005, 10.5, 0, 0, 0] )
)
);
dt << New Column( "Get Name",character);
colNames = dt << get column names( continuous,string );
For Each Row(
theList = {};
For Each( {col, i}, colNames,
If( As Column( col ) > 3000,
Insert Into( theList, col )
)
);
:Get Name = Concat Items( theList, "," );
);
回复:获取具有特定截止值的列名嗨吉姆,
谢谢你的帮助。但是,我有 180 列和 20000 行不同的单词,我无法将它们全部放入以下脚本中。你能给我提供更多建议吗?
谢谢
回复:获取具有特定截止值的列名这可能足够快
Names Default To Here(1);
// Create a sample data table
dt = New Table("Example",
Add Rows(20000),
invisible
);
colcount = 200;
For(i = 1, i <= colcount, i++,
newcol = dt << New Column(Char(i), Numeric, Continuous, Formula(
Random Normal() * 1000
));
dt << run formulas;
newcol << delete formula;
);
start = Tick Seconds();
colnames = dt << Get Column Names("String");
newcol = dt << New Column("getname", Character, Nominal, Formula(
valid_idx = Loc(dt[Row(), colnames] > 1000);
If(N Items(valid_idx) > 0,
Concat Items(colnames[valid_idx], ", ")
,
""
);
));
dt << run formulas;
newcol << delete formula;
wait(0);
end = Tick Seconds();
show(end - start);回复:获取具有特定截止值的列名嗨,贾莫,
非常感谢。但结果是“结束 - 开始 = 0.0333333333255723;”这不是新表。您能提供更多解决方案吗?请在 JMP 上向我展示以下数据表。
谢谢
回复:获取具有特定截止值的列名我的脚本使用以下值创建新列“getname”

使用您的数据,将列修复为数字(并删除无列)

回复:获取具有特定截止值的列名嗨,贾莫,
感谢您的帮助,但说实话,如以下附件所示,我无法像您那样运行脚本。当我检查下面显示的脚本(命令 + 1)时。感谢您的帮助。
dt = New Table("Example",
Add Rows(20000),
invisible
);
colcount = 200;
For(i = 1, i <= colcount, i++,
newcol = dt << New Column(Char(i), Numeric, Continuous, Formula(
Random Normal() * 1000
));
dt << run formulas;
newcol << delete formula;
);
start = Tick Seconds();
colnames = dt << Get Column Names("String");
newcol = dt << New Column("getname", Character, Nominal, Formula(
valid_idx = Loc(dt[Row(), colnames] > 1000);
If(N Items(valid_idx) > 0,
Concat Items(colnames[valid_idx], ", ")
,
""
);
));
dt << run formulas;
newcol << delete formula;
wait(0);
end = Tick Seconds();
show(end - start);
/*:
end - start = 0.683333333348855;
回复:获取具有特定截止值的列名您必须打开表格,修复列,然后运行创建新列的部分
Names Default To Here(1);
dt = Open("$DOWNLOADS/Examples_get column name_by cutoff.jmp", invisible);
colnames = Remove(dt << Get Column Names("String"), 1); // drop No column
// Fix data and modeling types
For Each({colname}, colnames,
Column(dt, colname) << Data Type("Numeric") << Modeling Type("Continuous");
);
newcol = dt << New Column("getname", Character, Nominal, Formula(
valid_idx = Loc(dt[Row(), colnames] > 1000);
If(N Items(valid_idx) > 0,
Concat Items(colnames[valid_idx], ", ")
,
""
);
));
dt << run formulas;
newcol << delete formula;
我强烈建议你查看JMP 帮助中的脚本指南
回复:获取具有特定截止值的列名嗨 Jarmo,你知道如何提取大于截止值的值吗(如果我有 50 列)以及每个列名(示例中的 getname 列)
回复:获取具有特定截止值的列名您希望如何提取它们?我的解决方案不是会创建新列,其中的列名称为以 , 和空格分隔的字符串吗?

您是否希望按列而不是按行检查值?还是其他方式?
编辑:
如果您只是想要不同的列表,我必须知道如何过滤它。如果您只想要所有列,请删除 Remove() 函数
Names Default To Here(1);
dt = Open("$DOWNLOADS/Examples_get column name_by cutoff.jmp", invisible);
colnames = dt << Get Column Names("String");
For Each({colname}, colnames,
Column(dt, colname) << Data Type("Numeric") << Modeling Type("Continuous");
);
For(i = 1, i < 100, i++,
newcol = dt << New Column(Hex(i), Numeric, Nominal, Values(J(1, N Rows(dt), Random Normal()*1000)));
);
colnames = dt << Get Column Names("String");
newcol = dt << New Column("getname", Character, Nominal, Formula(
valid_idx = Loc(dt[Row(), colnames] > 1000);
If(N Items(valid_idx) > 0,
Concat Items(colnames[valid_idx], ", ")
,
""
);
));
dt << run formulas;
newcol << delete formula;回复:获取具有特定截止值的列名这是可能有助于处理大量列的替代方法
Names Default To Here( 1 );
dt = Open("$DOWNLOADS/Examples_get column name_by cutoff.jmp");
colnames = Remove( dt << Get Column Names( "String" ), 1 ); // drop No column
// Fix data and modeling types
For Each({colname}, colnames,
Column(dt, colname) << Data Type("Numeric") << Modeling Type("Continuous");
);
dtStack = dt << Stack(
columns( colnames ),
Source Label Column( "ColName" ),
Stacked Data Column( "Value" ),
Output Table( "The Stack" )
);
dtStack << select where( :value <= 1000 );
dtStack << delete rows;
dtStack << delete columns( Value );
dtSplit = dtStack << Split(
Split By( :ColName ),
Split( :ColName ),
Group( :No ),
Output Table( "Split of The Stack by ColName" ),
Sort by Column Property
);
close( dtStack, nosave );
colnames = Remove( dtSplit << Get Column Names( "String" ), 1 );
dtSplit << Combine Columns(
delimiter( "," ),
columns( colnames ),
Column Name( "Get Name" )
);
dtSplit << delete columns( colnames );
dt << Update( With( dtSplit ), Match Columns( :No = :No ) );
Close( dtSplit, nosave );回复:获取具有特定截止值的列名
非常感谢,我想澄清一下。我有另一个感兴趣的列作为“感兴趣的字母表”,我想获取所有值大于 1,000 的列的名称和值,并且所有列都与感兴趣的列字母表匹配。
谢谢你!
回复:获取具有特定截止值的列名谢谢你,吉姆,但是它不起作用。请查看附件。
回复:获取具有特定截止值的列名最有可能的是,按照 Jim 的建议做事会更快更容易,但你可以用我演示的方法做这样的事
Names Default To Here(1);
dt = Open("$DOWNLOADS/Examples_get column name_by cutoff.jmp", invisible);
Summarize(dt, alphs = By(:"Alphabet of interest"n));
aa = Associative Array(alphs, Repeat({{}}, N Items(alphs)));
collist = dt << Get Column Names("String");
For Each({colname}, collist,
alph = Word(1, colname, "*");
If(Contains(aa, alph),
Insert Into(aa[alph], colname);
Column(dt, colname) << Set Data Type("Numeric") << Modeling Type("Continuous");
);
);
str_template = "^col^ (^val^)";
newcol = dt << New Column("getname", Character, Nominal, Formula(
cols = aa[:"Alphabet of interest"n];
vals = dt[Row(), aa[:"Alphabet of interest"n]];
valid_idx = Loc(vals > 1000);
If(N Items(valid_idx) > 0,
res = {};
For Each({{col, val}}, Across(cols[valid_idx], vals[valid_idx]),
Insert Into(res, Eval Insert(str_template));
);
Concat Items(res, ", ");
,
""
);
));
dt << run formulas;
newcol << delete formula;
dt << show window(1);

回复:获取具有特定截止值的列名如果脚本被编写为运行名为“否”的列,后面跟着数字列。您提供的数据表除了数字列外还有 2 个字符列。如果您删除“感兴趣的字母表”和“获取名称和值”列,然后运行脚本,它就可以正常工作。
您应该能够轻松更改脚本以补偿额外的列。在开始获取 colname 之前在脚本中删除它们,或者在处理 For Each 之前从 colname 列表中删除它们应该有效。
回复:获取具有特定截止值的列名非常感谢。这个脚本确实有效。但是,很抱歉,我的原始数据比这更复杂。感兴趣的字母表有多个“字母表”和“数字”,用“,”分隔(A1,B9)作为附加文件。我如何才能获得与感兴趣的字母表列和列名称相关的名称和值列。

感谢您的帮助。
回复:获取具有特定截止值的列名这些“字母”是如何确定的?它们是最后一个“_”之后的所有内容吗?如果是这样的话,你应该能够对我的脚本进行非常轻微的修改,取最后一个单词而不是第一个单词,并使用不同的分隔符,因此这部分需要稍微修改
alph = Word(1, colname, "*");
回复:获取具有特定截止值的列名谢谢你的建议。如果我想匹配“:”之前的第一个单词,应该是这个
alph = Word(1, colname, ":");
如果我想匹配“_”后面的最后一个单词应该是这个
alph = Word(-1, colname, "_");
如果我需要同时匹配“:”之前和“_”之后怎么办?在我加入上面为每个脚本运行的脚本后,我无法处理重复(完全相同的事情)。
谢谢
回复:获取具有特定截止值的列名查看表格的开始和结束将会有所不同(开始 A*1 和结束 A1),因此您必须将这些“额外”的键添加到关联数组中以执行比较并在以后处理重复项。
回复:获取具有特定截止值的列名此外,如果感兴趣的字母表中的某一列有超过 1 个,则脚本不会运行。您对此有什么建议吗?
谢谢你!
回复:获取具有特定截止值的列名我的脚本处理了您提供的情况。根据实际问题,脚本可能需要完全重写,也可能只需要进行一些小修改。
回复:获取具有特定截止值的列名谢谢 Jarmo,我想附上与我想在这里做的事情兼容的文件。我想将由 DOA 和 DO 组成的字母列与 DOA1*0x:0x、DOB1*0x:0x_DOx 的每一列进行匹配。DOA0x 与 DOA1*0x 匹配(不包括“:”之后的字符),DOx 或 DOB1*Ox 与 DOx 匹配。它们都需要具有大于 1000 的值才能显示在结果列中。我无法像您说的那样更正现有公式。提前谢谢您!
回复:获取具有特定截止值的列名为什么 DOA1*0x 与 DOx 不匹配?
回复:获取具有特定截止值的列名这是某种脚本,我仍然需要猜测正确的规则,所以不知道它是否能完成它应该做的事情
Names Default To Here(1);
dt = Open("$DOWNLOADS/Examples_get column name_edit.jmp");
// fix data
For Each({colname}, dt << Get Column Names("Character", "String"),
If(colname == "Alphabet",
break();
);
Column(dt, colname) << Set Data Type("Numeric") << Set Modeling Type("Continuous");
);
dt << Delete Columns("get name and value");
dt << New Column("R", Numeric, Ordinal, Formula(Row()));
dt_stacked = dt << Stack(
columns(
:"DOA1*01:01,DOB1*01:01_DO1"n, :"DOA1*02:01,DOB1*01:01_DO1"n,
:"DOA1*03:01,DOB1*01:01_DO1"n, :"DOA1*02:01,DOB1*02:01_DO2"n,
:"DOA1*01:05,DOB1*02:01_DO2"n, :"DOA1*04:03,DOB1*03:01_DO3"n,
:"DOA1*06:01,DOB1*04:01_DO4"n, :"DOA1*05:01,DOB1*03:01_DO7"n
),
Source Label Column("Label"),
Stacked Data Column("Data"),
Output Table("stacked")
);
rows_to_delete = dt_stacked << Get Rows Where(:Data <= 1000);
dt_stacked << Delete Rows(rows_to_delete);
dt_stacked << New Column("Match", Numeric, Nominal);
For Each Row(dt_stacked,
alphs = Words(:Alphabet, ",");
temp_label = Regex(:Label, "(\d\*)", "", GLOBALREPLACE);
retval = 0;
For Each({alph}, alphs,
If(Contains(temp_label, alph),
retval = 1;
break();
);
);
:Match = retval;
);
rows_to_delete = dt_stacked << Get Rows Where(:Match == 0);
dt_stacked << Delete Rows(rows_to_delete);
dt_stacked << New Column("NewStr", Character, Nominal, Formula(
:Label || " (" || Char(:Data) || ")"
));
Summarize(dt_stacked, rs = By(:R));
fixed_rs = Transform Each({r}, rs, Num(r));
vals = Associative Array();
For Each({r}, fixed_rs,
t = dt_stacked << Get Rows Where(:R == r);
vals[r] = Concat Items(dt_stacked[t, "NewStr"], ",");
);
Close(dt_ stacked);
new_col = dt << New Column("Res", Character, Nominal, Formula(
If(Contains(vals, :R),
vals[:R]
,
""
);
));
dt << run formulas;
new_col << Delete Formula;
回复:获取具有特定截止值的列名这是生物学所无法比拟的。
回复:获取具有特定截止值的列名谢谢你,Jarmo。这是工作!