목록으로 여러 열을 다시 코딩For Each 함수를 사용하여 각 열을 통과하여 조건부 수식을 사용하여 여러 열을 다시 코딩하고 싶습니다. 다음 코드를 사용하여 성공적으로 코딩할 수 없습니다.
//Create list of columns to be recoded
ColNames = {dt:Name( "col 1" ), dt:Name( "col 2" ), dt:Name( "col 3" ), dt:Name( "col 4" )};
For Each( {listitem}, ColNames,
Recode(
listitem,
{Lowercase( _rcNow ), If( Contains( _rcNow, "too much" ),
"1000",
_rcNow
), Regex( _rcNow, "\D*(\d+\.?\d*)\D*", "\1", GLOBALREPLACE )}
)
);
내 직감은 For Each 절의 본문이 잘못되었다는 것입니다. 어떻게든 열을 더 명확하게 호출해야 합니다.
데이터 테이블 "dt"는 코드의 앞부분에서 설정됩니다. 기록을 위해 스크립트를 사용할 때 오류가 발생하지 않지만 열이 제대로 기록되지 않습니다. 감사해요.
소비자 및 시장 조사Re: 목록으로 여러 열을 다시 코딩나는 항상 열 이름을 사용하는 것을 좋아하고 열을 조작하거나 열에서 값을 가져와야 할 때 이를 사용하는 방법을 파악(또는 적어도 시도해 봅니다...)하는 것을 좋아합니다. 일반적으로 As Column(), Column() 또는 Eval() 중 하나이지만 때로는 더 창의적이어야 합니다.
때때로 유용할 수 있는 몇 가지 스니펫은 다음과 같습니다.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
// set name which would usually break
Column(dt, "name") << Set Name("@na-me");
str_col_list = dt << Get Column Names("String");
show(str_col_list);
column_list = dt << Get Column Reference(str_col_list);
show(column_list);
ascolumn_list = Transform Each({col_name}, str_col_list,
Name Expr(As Column(dt, col_name))
);
show(ascolumn_list);
참조 JMP 16에서 Name() 파서 지시어 사용 중단 그리고 이름(jmp.com) Name("열 이름") 관련
Re: 목록으로 여러 열을 다시 코딩당신의 도움을 주셔서 감사합니다! Jordan Hiller가 귀하의 원래 답변을 이해하는 데 도움을 주었습니다. 실제 열 목록을 사용하는 것이 작동하지 않는 동안 열 목록을 문자열로 사용하는 이유를 이해할 수 없지만 지금은 귀하의 솔루션을 따릅니다. 이제 열 이름이 어떻게 호출되는지 확인하는 데 도움이 됩니다. 좋은 알림. 다시 한번 감사드립니다.
Re: 목록으로 여러 열을 다시 코딩Recode Columns에 필요한 열 형식이 무엇인지 잘 모르겠습니다. ColNames에 대해 서로 다른 구문을 사용하고 있음을 알 수 있습니다(저는 열 이름 목록을 사용하고 있으며 이전 방법을 사용하여 열을 참조하고 있습니다(Name("col name"), "col name"n으로 대체됨). , 또한 Target Column에서 다른 열을 사용하고 있습니다.
이 데이터 테이블과 함께 제공한 예제를 실행하는 경우:

나는 이것으로 끝납니다

다음은 새 테이블과 ColNames 목록에 더 많은 열이 추가된 업데이트된 예입니다.
Names Default To Here(1);
dt = New Table("Untitled 2",
Add Rows(3),
Compress File When Saved(1),
New Column("col 1", Character, "Nominal", Set Values({"1000", "too much", "too much"})),
New Column("col 2",
Character,
"Nominal",
Set Values({"too much", "", ""}),
Set Display Width(65)
),
New Column("col 3", Character, "Nominal", Set Values({"c", "", "too much"})),
New Column("col 4", Character, "Nominal", Set Values({"d", "", ""}))
);
wait(1);
//Create list of columns to be recoded
ColNames = {"col 1", "col 2", "col 3", "col 4"};
For Each({listitem}, ColNames,
dt << Recode Column(
//As Column(dt, listitem),
As Column(listitem),
{Lowercase(_rcNow), If(Contains(_rcNow, "too much"),
"1000",
_rcNow
), Regex(_rcNow, "\D*(\d+\.?\d*)\D*", "\1", GLOBALREPLACE)},
Update Properties(1),
Target Column(Column(listitem))
)
);
Re: 목록으로 여러 열을 다시 코딩내 목적에 맞게 여기에 코드를 수정했지만(목록의 여러 열) 여전히 작동하지 않습니다.
ColNames = {dt:Name("col 1"), dt:Name("col 2"),
dt:Name("col 3"), dt:Name("col4")};
For Each({listitem}, ColNames,
dt<<RECODE column=""></RECODE>다시 코딩하기 위해 열 단위로 이동하도록 제안했습니까?
Re: 목록으로 여러 열을 다시 코딩Recode 대신 Recode Column을 사용한 다음 열을 참조하는 방법에 대해 약간 수정해야 할 수도 있습니다.
이것은 작동하는 것 같습니다. 적어도 열 1에서 1000으로 너무 많이 대체합니다.
Names Default To Here(1);
dt = New Table("Untitled 2",
Add Rows(1),
New Column("col 1", Character, "Nominal", Set Values({"too much"})),
New Column("col 2", Character, "Nominal", Set Values({"a"})),
New Column("col 3", Character, "Nominal", Set Values({"c"})),
New Column("col 4", Character, "Nominal", Set Values({"d"}))
);
//Create list of columns to be recoded
ColNames = {"col 1"};
For Each({listitem}, ColNames,
dt << Recode Column(
//As Column(dt, listitem),
AsColumn(listitem),
{Lowercase(_rcNow), If(Contains(_rcNow, "too much"),
"1000",
_rcNow
), Regex(_rcNow, "\D*(\d+\.?\d*)\D*", "\1", GLOBALREPLACE)},
Update Properties(1),
Target Column(Column(listitem))
)
);