전치를 사용하여 한 테이블의 데이터 하위 집합을 두 번째 테이블의 열로 이동합니다.다시 올려서 죄송합니다. 제 워크플로우의 일부를 여기에 마스크로 가려서 올려서 도움을 요청했는데, 아직도 어려움을 겪고 있습니다. StackOverflow에서 아무런 이유 없이 소리를 지르는 등 나쁜 경험을 했기 때문에 응답을 확인하는 데 어려움이 있습니다. 시간이 지나면서 상처가 아물 것이라고 확신합니다. 어쨌든 저는 살아 있고 언젠가는 여러분의 응답을 받을 것입니다.
기술적인 요점으로 들어가자면:
저는 일부 샘플이 실행된 날짜를 복사하려고 합니다(프로젝트의 실험실 부분에서 모든 것이 잘 진행되었다고 가정할 때 각 샘플은 3번에 걸쳐 실행되어야 했지만 저는 그 과정에 참여하지 못했습니다). 저희 프로젝트의 진행 중인 메타데이터를 추적하는 매니페스트 파일의 3개 열에 복사하려고 합니다. 제가 알아낸 바에 따르면, 각 열은 데이터 수집의 한 인스턴스입니다. 각각 기증자 ID가 있는 여러 기증자가 있고, "동일한 데이터 포인트"에 대한 기기의 여러 수집 채널과 같은 데이터 중복이 있지만(어떻게 보느냐에 따라 다름), 제 생각에는 그게 전부일 겁니다.
여기 제가 작업하려고 했던 의사코드가 있는데 지금까지 힘들었습니다. 왜 그런지는 모르겠습니다. 저는 노련한 컴퓨터 과학자, 개발자 또는 소프트웨어 엔지니어가 아닙니다. 도움을 주시면 감사하겠습니다.
DataTypes:
(associative array) DonorID{
(key) Month1: (value) date1 (empty at start)
(key) Month2: (value) date2 (empty at start)
(key) Month3: (value) date3 (empty at start)
}
find unique donor IDs in data
for each donor ID{
get (i.e. subset) data keyed on donor ID;
for Month in 1, 2, 3 (strings){
if no date in donorID associative array{
add date from data;
}else if date already{
is the date in the data table cell the same as in the associative array entry?
if yes, do nothing (indicates different target channel)
if no, ping user
Multiple run dates for same data point is a problem.
}
}
}
Copy from data to manifest:
loop over DonorID associative array:
for each donorID:
in Month 1, 2, or 3:
add date1 2 or 3 to "Actual Month [1, 2, or 3] Stability Test Date" in manifest
donorID is still row identifier
date (1, 2, or 3) is now column identifier
데이터 블렌딩 및 정리Re: 전치를 사용하여 한 테이블에서 두 번째 테이블의 열로 데이터의 하위 집합을 이동합니다.이제 올바른 ID가 있는 행의 매니페스트 파일에 데이터/날짜를 할당하려고 합니다.
... );
//write(LBCM_array);
dt_manifest << Get Rows Where(dt_manifest:ID Number for Updating Table == ID)[:Actual Data 1 Date] = data_array["data1"];
//repeat for data 2 & 3
);
실제로 초보자로서 JSL에서 수행하는 방법을 아직 모르기 때문에 오류가 발생합니다.
["data1" => {}, "data2" => {}, "data3" => {}]
attempting to assign to an object that is not an L-value in access or evaluation of 'Assign' , dt_manifest << Get Rows Where(
dt_manifest:ID Number for Updating Table == ID
)[:Actual Data 1 Date] = /*###*/data_array["data1"] /*###*/이것이 무엇을 의미하는지 모르겠습니다.
감사,
마이크
Re: 전치를 사용하여 한 테이블에서 두 번째 테이블의 열로 데이터의 하위 집합을 이동합니다.아래는 나를 위해 작동합니다 ...
Names Default To Here( 1 );
dt_data = Open("...");
Summarize( dt_data, IDs = by(dt_data:ID)); //this finds all the unique donor IDs in the data file, which we will need
//First, populate the temporary data structure--associative array--from the data file which we will then copy over to the manifest data file.
For(i = 1, i <= N Items(IDs), i++,
ID = num(IDs[i]); //the type conversion here is important, or else a key-value call in the associative array below doesn't work
data_array = Associative Array( {"data1", "data2", "data3"}, {{}, {}, {}} ); //it appears in the print statements we get 3 copies, indicating this loop works
For( data = data_array << First, !Is Empty( data ), data = data_array << Next( data ), //looping through data_array's keys is clunky but done this way in JMP
data_array[data] = dt_data:Run date[dt_data << Get rows Where(:ID == ID & :Timepoint == data)]
);
);지금을 제외하고는 data_array에 각 데이터(날짜 시점) 항목의 여러 복사본이 있습니다. data_array에서 각 날짜/데이터의 복사본을 하나만 만들어 깨끗이 닦는 방법이 궁금합니다.
저는 As Date() 문을 사용하여 비교 및 입력을 위한 날짜를 비교하고 서식을 지정하여 하나의 고유한 값만 얻도록 if 문을 시도했습니다. 그러나 그것은 지금까지 나에게 문제를 안겨주었습니다(즉, 배열이 오류로 바뀌거나 다시 비어 있음).
그래도 지금까지의 발전에 정말 만족합니다.
@txnelson : 죄송합니다. 귀하의 방법이 마음에 들며 도움을 주셔서 감사합니다. 하지만 "k" 인덱싱 기술 없이도 제가 그것을 부채질할 수 있었다는 것을 알게 되실 것입니다
. (동일한 값의 날짜가 여러 개 있을 때 귀하의 방법이 어떻게 공정한지 궁금합니다. 제 경우에는 이것이 무엇입니까?)
@brady_brady : 적절한 경우 열 호출 전에 데이터 테이블 식별자를 구현했습니다. 이 기본 개념을 가르쳐 주셔서 감사합니다. 나는 그것에 대해 호기심에 죽어 가고 있었고 지금까지 결과가 없었습니다.
마이크
Re: 전치를 사용하여 한 테이블에서 두 번째 테이블의 열로 데이터의 하위 집합을 이동합니다.안녕하세요. 어느 방향으로 가야할지 모른 채 무언가에 매달리는 대신 실제로 한 번만 진행하고 있습니다.
현재 내 키/값 쌍 중 하나가 맞지 않아 배열 호출 중 하나에서 잘못된 결과를 얻고 있습니다. 연관 배열로 전송하기 위해 원하는 데이터 테이블을 올바르게 하위 집합/필터링할 수 있도록 이것을 디버깅하려고 합니다.
모든 도움에 감사드립니다.
마이크Re: 전치를 사용하여 한 테이블에서 두 번째 테이블의 열로 데이터의 하위 집합을 이동합니다.고마워, 브래디. 그 모든 것이 나에게 의미가 있습니다.
그 중 몇 가지가 실제로 내 코드에서 문제인 것 같습니다. 나는 그들에게 말했고 함께 가고 있습니다. 내가 그것들을 조금 알아낸 후에 게시할 새로운 문제가 있습니다.
마이크
Re: 전치를 사용하여 한 테이블에서 두 번째 테이블의 열로 데이터의 하위 집합을 이동합니다.안녕 짐. 응답해 주셔서 감사합니다. 코드가 어떻게 작동하는지 인간 영어로 설명해 주시겠습니까? 내 해석은 다음과 같습니다. ID가 고유한 모든 행은 theRows에 배치됩니다. 그런 다음 인덱스 k가 인스턴스화됩니다.실행 날짜가 데이터 배열에 추가되는 루프 내에서 증가합니다.이제 이 루프 내에서 이전에 가지고 있던 것 대신에 theRows의 각 고유 값이 인덱스로 사용되어 :Run date에 액세스하고 해당 결과가 데이터 배열에 채워집니다.
내가 더 오래 공부했다면 이것은 나에게 의미가 있을 것입니다. 언뜻보기에 너무 명확하지 않습니다. 확실하지 않다. 그러나 게시물 끝에 한 줄 결론으로 설명합니다.
스크러빙된 모든 변수를 내 코드의 실제 변수로 바꾼 후 오류가 발생합니다.
invalid subscript (must be number or list of numbers) in access or evaluation of 'theRows[k]' , theRows[/*###*/k]
이유를 모르겠습니다.
나는 여전히 혼란스럽고 이 코드를 계속 연구할 것입니다. 이상하게도 저는 대학에서 상당한 양의 코딩 수업을 들었지만 제 지식 기반을 유지하지 않았기 때문에 시간이 지남에 따라 침식되었을 수 있다고 생각합니다.
도와주셔서 감사합니다!
남자 이름
추신: 연관 배열을 사용하는 이유: Java/Python 계열에 더 많은 경험이 있는 JMP 초보자로서 데이터를 전송하는 효율적인 방법이라고 생각했습니다. 테이블을 직접 조작하는 것이 좋습니다? 하지만 저는 이 경로를 따라 너무 멀기 때문에 이러한 방식으로 당면한 작업을 완료하는 것이 완전히 흥미로울지 궁금합니다.
Re: 전치를 사용하여 한 테이블에서 두 번째 테이블의 열로 데이터의 하위 집합을 이동합니다.안녕,
당신은 쓰기:
내 문제는 현재 이 줄에 있습니다.
data_array[data] = :Run date << Where(:ID == ID & :Timepoint == data);
몇 가지 잠재적인 문제가 있습니다... 다음을 확인하세요.
1) :작성된 실행 날짜는 이 코드 줄이 해석되는 시점에 최신 데이터 테이블의 열을 나타냅니다. 오류 메시지에서 이 코드 줄을 해석할 때 현재 데이터 테이블에 "실행 날짜"라는 열이 포함되어 있지 않은 것으로 보입니다. 나는 당신이 두 개의 테이블을 여는 것을 봅니다. 사용할 테이블을 JMP에 맡기는 경우 의도한 테이블이 실제로 현재 테이블인지 항상 확인하십시오. 현재 데이터 테이블 명령을 사용하여 원하는 테이블을 강제로 현재 테이블로 만들 수 있습니다.
dt1 = open("firstfile");
dt2 = open("secondfile");
Current Data Table (dt1); // sets first table current
Current Data Table (dt2); //sets second table current
하지만 결정을 JMP에 맡길 필요는 없습니다. 다음을 사용하여 현재 여부에 관계없이 사용할 테이블을 명시적으로 지정할 수 있습니다. 표:열 다음과 같은 형식:
dt1:Run Date
2) 테이블 통화 문제를 해결하면 다음을 사용해야 합니다. << 행 가져오기 ( ) 일부 기준을 충족하는 행을 반환하기 위해 적절한 데이터 테이블로 전송되는 메시지입니다. 귀하의 경우와 같이 종종 이들은 색인으로 사용됩니다. dt1로 작업한다고 가정하면 코드는 다음과 같이 나타납니다.
data_array[data] = dt1:Run Date[dt1 << Get rows Where(:ID == ID & :Timepoint == data)];
이 줄은 3가지 작업을 수행합니다.
1) 일부 기준을 충족하는 dt1의 행을 가져와서 벡터로 반환합니다. 때문에 << 행 가져오기 where() 메시지가 dt1로 전송되면 :ID 및 :Timepoint도 dt1에 있음을 알 수 있습니다.
2) 위의 1단계에서 반환된 벡터를 dt1:실행 날짜(dt1의 실행 날짜 열)에 대한 인덱스로 사용합니다. dt1:Run Date를 사용하여 Run Date의 범위를 dt1 테이블로 명시적으로 지정했기 때문에 dt1이 현재 테이블인지 여부는 중요하지 않습니다. 이 두 번째 단계를 완료하면 실행 날짜 열에서 값 벡터(정확히 원하는 항목)가 반환됩니다.
3) 위의 2단계에서 반환된 Run Date 값의 벡터를 특정 키의 값으로 할당하고, 데이터, 연관 배열에서, data_array .
건배,
브래디
Re: 전치를 사용하여 한 테이블에서 두 번째 테이블의 열로 데이터의 하위 집합을 이동합니다.마이크,
Associative Array를 사용하려는 이유에 대해 약간의 이해가 부족하지만, 그럼에도 불구하고 아래 코드가 각 ID에 대한 3개의 측정 행에 대한 날짜 값인 배열로 이동할 것이라고 생각합니다.귀하의 데이터 레이아웃과 유사하기를 바라는 일부 데이터를 구성했습니다.나는 귀하의 진술과 코드 사용을 기반으로 추측하고 있습니다.

다음은 스크립트입니다.위의 데이터 테이블은 스크립트 시작 부분에서 생성되므로 내 수정 사항이 포함된 코드의 핵심은 데이터 테이블 생성 아래에 있습니다.
Names Default To Here( 1 );
dt_data = New Table( "Example",
Add Rows( 6 ),
New Column( "ID", Character, "Nominal", Set Values( {"A", "A", "A", "B", "B", "B"} ) ),
New Column( "Run Date",
Numeric,
"Continuous",
Format( "m/d/y", 12 ),
Input Format( "m/d/y" ),
Set Values( [3692304000, 3694982400, 3697401600, 3700080000, 3702672000, 3705350400] )
),
New Column( "TimePoint", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [., ., ., ., ., .] ) )
);
//dt_manifest = Open( "[filepath, no issues here]" );
Summarize( dt_data, IDs = by( :ID ) ); //this finds all the unique IDs in the data file, which we will need //[no issues here]
//First, populate the temporary data structure--associative array--from the data file which we will then copy over to the manifest file.
For( i = 1, i <= N Items( IDs ), i++,
ID = IDs[i];
theRows = dt_data << get rows where( :ID == ID );
data_array = Associative Array( {"data1", "data2", "data3"}, {{}, {}, {}} );
k=0;
For( data = data_array << First, !Is Empty( data ), data = data_array << Next( data ), //looping through data_array's keys is clunky but done this way in JMP
k++;
show( ID ); //just a check; works
data_array[data] = :Run date[theRows[k]];
//...continue with further code to transfer from LBCM_array to manifest
);
show(data_array);
);
코드 결과는 로그에 나열됩니다.
ID = "A";
ID = "A";
ID = "A";
data_array = ["data1" => 3692304000, "data2" => 3694982400, "data3" => 3697401600];
ID = "B";
ID = "B";
ID = "B";
data_array = ["data1" => 3700080000, "data2" => 3702672000, "data3" => 3705350400];
data_array의 숫자는 실행 날짜의 숫자 값입니다.
Re: 전치를 사용하여 한 테이블에서 두 번째 테이블의 열로 데이터의 하위 집합을 이동합니다.안녕하세요 여러분. 지금까지 내 코드는 다음과 같습니다.
Names Default To Here( 1 );
dt_data = Open( "[filepath, no issues here]" );
dt_manifest = Open( "[filepath, no issues here]" );
Summarize( dt_data, IDs = by( :ID ) ); //this finds all the unique IDs in the data file, which we will need //[no issues here]
//First, populate the temporary data structure--associative array--from the data file which we will then copy over to the manifest file.
For( i = 1, i <= N Items( IDs ), i++,
ID = IDs[i];
data_array = Associative Array( {"data1", "data2", "data3"}, {{}, {}, {}} ); //it appears in the print statements we get 3 copies, indicating this loop works
For( data = data_array << First, !Is Empty( data ), data = data_array << Next( data ), //looping through data_array's keys is clunky but done this way in JMP
Write( ID ); //just a check; works
data_array[data] = :Run date << Where(:ID == ID & :Timepoint == data); //does not work
//...continue with further code to transfer from LBCM_array to manifest
);
);구조와 정보(이름 'a' 이름, 레이블 간)를 유지하면서 기밀로 만들었습니다(기업 정보를 염탐할 걱정이 없습니다
).
내 문제는 현재 이 줄에 있습니다.
data_array[data] = :Run date << Where(:ID == ID & :Timepoint == data);
그것은 오류 메시지를 던졌습니다
.
Name Unresolved: Run date in access or evaluation of 'Run date' , :Run date/*###*/
In the following script, error marked by /*###*/
...
data_array[data] = :Run date/*###*/ <<WHERE></WHERE>
:실행 날짜는 실험 실행 날짜가 포함된 내 데이터 테이블(구체적으로 dt_data)의 데이터 열(헤더)입니다. 각 데이터 포인트가 세 번/세 번 수집되어야 하므로 초기화할 때 data_array에 세 개의 키와 세 개의 빈 값이 있는 이유이므로 두 번째 파일로 전송하려고 합니다. 이것은 데이터가 가는 곳, 이 연관 배열(data_array)입니다. 그런 다음 dt_manifest로 전송되지만 이 부분이 작동하면 나중을 위한 것입니다.
지금은 액세스하는 데 문제가 있는 것 같습니다.
data_array[data] = :Run date << Where(:ID == ID & :Timepoint == data);
관심 있는 행과 열의 적절한 선택. 이 시점에서 청중 중 누구라도 데이터의 하위 집합을 선택하는 방법을 보다 구문적으로(그리고 아마도 의미론적으로) 올바른 방법으로 지정하는 방법에 대해 솔루션 또는 기여를 제공하고 제안할 수 있도록 문제 설명이 충분히 명확합니까? (data_dt에서)에 관심이 있으십니까?
전치 문제에 대해 걱정하지 마십시오. 나중에 다루겠습니다. 솔직히 데이터가 aa(연관 배열)에 있으면 꽤 쉬울 것이라고 생각합니다. 이 시점에서 나는 여전히 행/열 선택, 데이터 테이블의 하위 집합 등 관련 문제를 조작하는 방법을 배우고 있습니다.
추가 참고 사항: 날짜와 데이터 및 배열이 뒤섞인 것이 이상하게 보인다면 아마도 회사의 비밀을 안전하게 유지하기 위해 데이터 열 또는 관련 데이터 엔터티의 스크러빙/익명화 제목/레이블에 좋지 않은 이름을 선택했기 때문일 것입니다. 나는 여전히 내가 말하고 싶은 이 모든 과정에서 신인이고 안전한 편에서 실수하는 것을 선호합니다.
나는 내 끝에서 문제를 계속 작업할 것입니다.
감사합니다.
마이크
Re: 전치를 사용하여 한 테이블에서 두 번째 테이블의 열로 데이터의 하위 집합을 이동합니다.고마워, 브래디.Re: 전치를 사용하여 한 테이블에서 두 번째 테이블의 열로 데이터의 하위 집합을 이동합니다.안녕,
커뮤니티에 오신 것을 환영합니다! 다른 게시판에서 도움을 요청하실 때 부정적인 경험을 하셨다니 죄송합니다. JMP 사용자 커뮤니티는 환영하고 도움이 되는 곳이지만 원하는 정보를 얻을 수 있는 기회를 극대화할 수 있는 몇 가지 "모범 사례"가 있습니다.
구체적이고 좀 더 일반적인 질문을 하는 것이 해낼 수 있다면 갈 수 있는 방법입니다. 하지만 때때로 사람은 "자신이 모르는 것을 모른다"는 것을 알고 있습니다. 상당한 양의 의사 코드를 게시하면 사람들이 겁을 먹을 수 있습니다. 다른 방법으로 질문할 수 없다면 "이전" 및 "이후" 파일과 스크린샷을 첨부하는 것이 크게 도움이 될 것입니다. "시작" 테이블(또는 텍스트 데이터) 및 "완료" 테이블의 예. 이것은 이 특정한 경우에 확실히 실질적인 차이를 만들 것입니다. 데이터 세트를 "소독"해야 한다면 괜찮습니다(정말 최고). 설명하려는 요점이 여전히 만들어질 수 있는 한 모두 좋습니다.
구체적이고 대상이 명확한 질문을 하고 설명 파일과 스크린샷을 포함하면 여기에 있는 많은 사람들이 도움을 줄 가능성이 있습니다. 정말 저항 할 수없는 몇 명 이상을 생각할 수 있습니다!
건배,
브래디