导入具有包装单元格内容的Excel工作表你好
尽管我知道最好避免在Excel for Analysis中包装单元格,但是我有一位拥有此类数据的客户。使用Excel导入向导进行导入还可以导入已包装的单元格,尽管您必须跨较大的行才能看到所有条目。默认情况下,这些列是字符列和标称列。但是不能用于分析。想象一下,第一列在一个单元格中有多个国家(DE,US,ES),第二列在一个单元格中具有相关的数值(例如,分数为10、15、7)。这意味着德国的得分为10,美国的得分为15,ES为7。
如何处理这类数据?有没有办法将其导入到分隔行中?
(这只是数据的简化版本,您可以考虑其他变量和分组变量,例如研究/项目等,其中这些单元格之一属于每个研究之一。)
到目前为止,我已经尝试过:
要在JMP中使用此数据,可以使用多重响应变量,并将属性“多重响应”设置为定界符“”,因为换行没有定界符为“,”或“;”。到目前为止,一切都很好,但是现在通过频率而不是数值来分析数据。因此无法使用一堆分析方法。
堆栈,拆分和其他表操作对我不起作用,因为它们没有考虑多个响应列,而是将整个条目作为一个值。扩展到列我也没有成功,尽管我可能找不到窍门。但是,这似乎已经涉及许多步骤才能找到一个好的解决方案,但是任何解决方案都比没有解决方案要好:)
我想最好的解决方案是已经在Excel中提供了不同结构/格式的数据。或者您还有其他建议吗?
附加了excel文件和脚本,以导入并将建模类型更改为“多个响应”。
谢谢,
马丁
回复:导入带有包装单元格内容的Excel工作表嗨,布雷迪,非常感谢!我强烈建议客户更改源代码中的格式,因为使用JSL可以处理此格式,但是如果有更多列需要另外处理,则可能会变得更加麻烦。
对我来说,具有连续和多个系列的堆栈选项现在也更加清楚。
谢谢,
马丁
回复:导入带有包装单元格内容的Excel工作表由于包装,此数据确实很难看。看看这是否有效;它似乎为我工作。
主要思想是:
折叠空白,用逗号替换换行符,将文本替换为列,并创建多个连续的堆栈。
此外,还有一些清除操作,例如列删除,空行删除和类型转换。
Names Default To Here(1);
dt = Open(pickfile(),
Worksheets( "Sheet1" ),
Worksheet Settings(
1,
Has Column Headers( 1 ),
Number of Rows in Headers( 1 ),
Headers Start on Row( 1 ),
Data Starts on Row( 2 ),
Data Starts on Column( 1 ),
)
);
dt << new column("C2", formula(collapse whitespace(substitute(:Country, "\!n",","))));
dt << new column("D2", formula(collapse whitespace(substitute(:Data, "\!n",","))));
dt << select columns({"C2", "D2"});
dt << text to columns(delimiter(","));
dt << Delete Columns;
dt << Delete Columns (1,2);
collist = dt << get column names(string);
colExpr = insert(expr(columns()), colList);
stackExpr = Expr(
dtStack = dt << Stack(
_CCC_,
Source Label Column( "Label" ),
Stacked Data Column( "Data" ),
Number of Series( 2 ),
Contiguous
)
);
substituteInto(stackExpr, expr(_CCC_), nameexpr(colExpr));
stackExpr;
dtStack << delete Columns (1,3);
dtStack << select where (:Data == "") << delete rows();
close(dt, nosave);
column(dtStack,1)<<SET name=""></SET>回复:导入带有包装单元格内容的Excel工作表嗯,好主意,但是我不能使用它,因为它要求将两列堆叠在一起,但是我只能选择其中一列。附上示例表,可能我用错了。
更正,如果我将表中的定界符更改为“,”,则可以使用它
For Each Row(
new1 = Substitute( Column( 1 )[], "\!n", "," );
Column( 1 )[] = new1;
);
For Each Row(
new2 = Substitute( Column( 2 )[], "\!n", "," );
Column( 2 )[] = new2;
);
但是,它仍然看起来不像我期望的茶几那样,就像这样:
|
ID
|
国家
|
数据
|
|
1个
|
德
|
10
|
|
1个
|
精氨酸
|
15
|
|
1个
|
美国
|
13
|
| 2 |
德 |
10 |
回复:导入带有包装单元格内容的Excel工作表您提出的“多响应列”构想使您处于使用的绝佳位置 @brady_brady 的数据表工具加载项。 那里有一个实用程序,可让您在“多个响应”和“堆叠”之间来回转换。 将其堆叠后,您就可以将建模和数据类型更改为适合数据的类型。
最好,
中号