将非重复(单列 ID)行追加到主表而不创建新表?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />场景:需要将每日调查数据文件(包括之前的所有日期)附加到仅包含非重复受访者 ID 记录的主表,并且无需创建新表(因为我不想丢失主表中选定的行)隐藏或排除
两次尝试:
连接维护主表,但带来所有记录
连接仅带来新记录,但会创建一个新表,因此行特征(隐藏、排除)会丢失
回复:将非重复(单列 ID)行追加到主表而不创建新表?出色的!!!
让我困惑的是这一行:
Parse( "Col Min( Row(), :Name(\!"" || Concat Items( dt << 获取列名称( string ), "\!"), :Name(\!"" ) || "\ !“))”);
我无法弄清楚第一个参数中的“Row()”做了什么。
非常感谢。
回复:将非重复(单列 ID)行追加到主表而不创建新表?嗨马丁,
你是对的。这些行完全符合您的推论。我添加了一些评论,以帮助其他人更清楚地了解这一点。
我很高兴您发现它有用!
回复:将非重复(单列 ID)行追加到主表而不创建新表?所以我想我已经弄清楚了。第 1 行生成一个字符串“Col Min( Row(), :name, :age, :sex, :height, :weight )”,该字符串将在 (2) 中用于确定所有列都匹配的上一行的行号。并且,2 会将重复行的行号添加到数组“duplicates”中。
这实在是太菜刀了。我想知道当一式三份时会发生什么。它会始终保留第一个实例并删除第二个和第三个实例吗?我需要尝试一下。
谢谢机器人!
回复:将非重复(单列 ID)行追加到主表而不创建新表?你好,机器人,你能解释一下这两行代码的作用吗?
谢谢
1. col_min = Parse( "Col Min( Row(), :Name(\!"" || Concat Items( dt << get 列名( string ), "\!"), :Name(\!"" ) || "\!"))" );
2. 对于每一行( If( col_min != Row(), 重复项 |/= Row() ) );
回复:将非重复(单列 ID)行追加到主表而不创建新表?嗨,cdwhite,
我不久前写了一个脚本,可能会有所帮助。下面的脚本将删除重复的行,同时保留原始数据表,包括公式和行状态。使用此脚本后面的连接函数可能会解决您的问题。
名称默认为此处( 1 );
// 创建数据表和新数据。
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt << 随机选择( 10 );
dt2 = dt << 子集( (选定行), 输出表名称( "新数据" ) );
dt << 清除选择;
dt2 << 添加行( {:name = "PETER", :age = 14, :sex = "M", :height = 61, :weight = 124} );
// 随机设置原始数据中的行状态。
dt << 随机选择( 10 ) << 隐藏 << 排除 << 清除选择;
// 添加新数据。
dt << 连接( dt2, 附加到第一个表);
关闭(dt2,不保存);
// 删除重复行。
dt = 当前数据表();
col_min = Parse( "Col Min( Row(), :Name(\!"" || Concat Items( dt << 获取列名称( string ), "\!"), :Name(\!"" ) || “\!”))“); // 创建一个 JSL 表达式来确定所有其他列的最小行号。
重复项 = []; // 创建矩阵来存储重复的行。
对于每一行( If( col_min != Row(), 重复项 |/= Row() ) ); // 将每一行与上面的“col_min”表达式进行比较。如果当前行与所有其他列的最小行不匹配,则该行将被添加到“重复项”矩阵中。
dt << 删除行(重复项); // 删除重复项。
nn = N 行(重复项);
New Window( "删除重复行", <回复:将非重复(单列 ID)行追加到主表而不创建新表?
我尝试使用更新主表选项,但它仍然创建一个新表。
数据表( “原来的” ) <<加入(
和(数据表( “新数据” ) ) ,
更新,
通过匹配列( :列号= :列号) ,
丢弃倍数( 1 , 1 ) ,
姓名( “包括不匹配项” )( 0 , 1 ) ,
保留主表顺序( 1 )
);

回复:将非重复(单列 ID)行追加到主表而不创建新表?执行联接时,您可以使用“使用第二个表中的数据更新主表”选项来避免创建新表。
回复:将非重复(单列 ID)行追加到主表而不创建新表?谢谢。将指定为行状态数据类型的新列添加到原始数据表,然后使用行状态菜单中的复制功能(通过单击左侧列列表框中的行状态列,而不是实际的列标题)来复制和复制然后在加入后重新应用行状态。行附加联接的脚本仅将调查数据集中的新记录(并忽略所有先前附加的案例)引入主数据表:
数据表( "主要调查数据集" ) << Join(
With( 数据表( "二次调查数据集" ) ),
合并同名列,
复制第二个表公式(0),
抑制主表公式求值( 0 ),
通过匹配列( :ResponseID = :ResponseID ),
删除倍数( 0, 0 ),
Name( "包含不匹配项" )(0, 1),
保留主表顺序( 1 )
)
连接两个文件后,使用行状态菜单从行状态列复制/恢复行状态。效果很好。谢谢你!
回复:将非重复(单列 ID)行追加到主表而不创建新表?您可以使用关联数组进行集合运算。找不到一种巧妙的方法将一个表附加到另一个表。必须使用 JSL 循环来处理数据。
dt_原始=新表( “原来的” ,添加行( 4 ) ,
新专栏( “列 ID” ,数字,连续的,格式( “最好的” , 12 ) ,
设定值( [ 1 , 2 , 3 , 4 ] )
) ,
新专栏( “结果” ,特点,标称,设定值( { “A” , “b” , “C” , “d” } ) )
) ;
dt_new =新表( “新数据” ,添加行( 10 ) ,
新专栏( “列 ID” ,数字,连续的,格式( “最好的” , 12 ) ,
设定值( [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ] )
) ,
新专栏( “结果” ,特点,标称,
设定值( { “A” , “b” , “C” , “d” , “e” , “F” , “G” , “H” , “我” , “j” } )
)
) ;
// 确定新表中哪些行不在旧表中
a_原始=关联数组(柱子( dt_原始, “列 ID” )) ;
重新=关联数组(柱子( dt_new , “列 ID” )) ;
重新<<消除( a_原始) ;
新行=重新<<获取钥匙;
// 必须有一种更快的方法将一个表附加到另一个表
你=行数( dt_原始) ;
号=尼特姆斯(新行) ;
dt_原始<<添加行(号) ;
为了(我= 1 ,我<=恩科尔斯( dt_原始) ,我++,
一个列=柱子( dt_原始,我) <<得到名字;
为了( k = 1 , k <=尼特姆斯(新行) , k ++,
米=新行[ k ] ;
n = k +你;
柱子( dt_原始,一个列)[ n ] =柱子( dt_new ,一个列)[米] ;
) ;
) ;
回复:将非重复(单列 ID)行追加到主表而不创建新表?我发现连接和连接表格有点艺术(即反复试验,直到得到我真正想要的东西)。但是,我建议您查找列类型“行状态”,因为您可以将所有当前行状态(即隐藏和排除的行状态)保存在一个列中,您可以根据需要将其重新应用到表中。