matlab中的反向编码
Reverse coding in matlab
我在matlab中有一个调查数据,我有一些反向编码的项目。我所需要的只是在某些 questions.I 中使用此代码 reversecoding = myStruct.mysurvey(:,4) == 5 ;
mySturct.mysurvey(reversecoding,4) = 3 ;
进行反向编码,但我意识到使用此代码可能会遇到一些问题。
例如,当我将 3 的值重新编码为 5 时;
myStruct.mysurvey=
3 3 3 3
6 6 6 6
3 3 3 3
7 6 6 7
4 3 5 5 <--
5 5 4 5 <--
...
reversecoding = myStruct.mysurvey(:,4) == 5 ;
mySturct.mysurvey(reversecoding,4) = 3
%after (the last 2 values has recoded to 3)
myStruct.mysurvey=
3 3 3 3
6 6 6 6
3 3 3 3
7 6 6 7
4 3 5 3 <--
5 5 4 3 <--
...
但在那之后,当我将 3 重新编码为 5 时,它会将我所有的 3(包括我刚刚从 5 重新编码的那些)重新编码为 5。
举例说明;
%after I recode 3s to 5
myStruct.mysurvey=
3 3 3 3
6 6 6 6
3 3 3 3
7 6 6 7
4 3 5 3 <--
5 5 4 3 <--
...
reversecoding = myStruct.mysurvey(:,4) == 3 ;
mySturct.mysurvey(reversecoding,4) = 5 ;
myStruct.mysurvey=
3 3 3 5
6 6 6 6
3 3 3 5
7 6 6 7
4 3 5 5 <--
5 5 4 5 <-- %他们又是 5
...
%再次将第 4 列的最后两个值返回到 5...
我怎样才能摆脱这个问题?这是代码;
reversecoding = myStruct.mysurvey(:,4) == 5 ;
mySturct.mysurvey(reversecoding,4) = 3 ;
% after
reversecoding = myStruct.mysurvey(:,4) == 3 ;
mySturct.mysurvey(reversecoding,4) = 5 ;
% all other values will be transformed.
%old 1 will be 7
%old 2 will be 6
...
%old 6 will be 2
%old 7 will be 1
重新编码的最佳方式是什么?我将从 1 重新编码到 7。
您可以使用 container map 创建从旧值到新值的映射。这很简单:
map = containers.Map(old_values, new_values);
或者你的情况
map = containers.Map(1:10, 10:-1:1);
然后您可以使用 map
将旧值映射到其对应的新值,如下所示:
>> map(1)
ans =
10
>> map(4)
ans =
7
请注意,您只能 "call" map
单个值,而不是数组。但是你可以使用例如arrayfun
将其简化为一次调用:
>> myStruct.mysurvey(:, 4) = [9, 2, 1, 10, 4]; % Example data
>> myStruct.mysurvey(:, 4)
ans =
9
2
1
10
4
>> myStruct.mysurvey(:, 4) = arrayfun(@(x) map(x), myStruct.mysurvey(:, 4));
>> myStruct.mysurvey(:, 4)
ans =
2
9
10
1
7
我找到了解决这个问题的另一种方法,但这有点让人头疼。
我使用逻辑索引为每个值创建了不同的变量。
%find elements to recode
fiveto3 = myStruct.mySurvey(:,4) == 5 ;
threeto5 = myStruct.mySurvey(:,4) == 3 ;
...
twoto6= myStruct.mySurvey(:,4)== 2;
sixto2= myStruct.mySurvey(:,4)== 6;
...
oneto7= myStruct.mySurvey(:,4) == 1;
sevento1 = myStruct.mySurvey(:,4)==7;
% time to recode
myStruct.mySurvey(fiveto3 , 4) = 3 ;
myStruct.mySurvey(threeto5,4) = 5 ;
myStruct.mySurvey(twoto6 , 4) = 6 ;
myStruct.mySurvey(sixto2 , 4) = 2 ;
myStruct.mySurvey(oneto7 , 4) = 7 ;
myStruct.mySurvey(sevento1 , 4) = 1 ;
clear fiveto3 threeto5 twoto6 sixto2 oneto7 sevento1 % to get rid of these variables.
这也有效,但如果要重新编码的值超过 10 个,则需要更多的努力和更多的行。你们都可以试试 container map 或者这个!
我在matlab中有一个调查数据,我有一些反向编码的项目。我所需要的只是在某些 questions.I 中使用此代码 reversecoding = myStruct.mysurvey(:,4) == 5 ;
mySturct.mysurvey(reversecoding,4) = 3 ;
进行反向编码,但我意识到使用此代码可能会遇到一些问题。
例如,当我将 3 的值重新编码为 5 时;
myStruct.mysurvey=
3 3 3 3
6 6 6 6
3 3 3 3
7 6 6 7
4 3 5 5 <--
5 5 4 5 <--
...
reversecoding = myStruct.mysurvey(:,4) == 5 ;
mySturct.mysurvey(reversecoding,4) = 3
%after (the last 2 values has recoded to 3)
myStruct.mysurvey=
3 3 3 3
6 6 6 6
3 3 3 3
7 6 6 7
4 3 5 3 <--
5 5 4 3 <--
...
但在那之后,当我将 3 重新编码为 5 时,它会将我所有的 3(包括我刚刚从 5 重新编码的那些)重新编码为 5。
举例说明;
%after I recode 3s to 5
myStruct.mysurvey=
3 3 3 3
6 6 6 6
3 3 3 3
7 6 6 7
4 3 5 3 <--
5 5 4 3 <--
...
reversecoding = myStruct.mysurvey(:,4) == 3 ;
mySturct.mysurvey(reversecoding,4) = 5 ;
myStruct.mysurvey= 3 3 3 5 6 6 6 6 3 3 3 5 7 6 6 7 4 3 5 5 <-- 5 5 4 5 <-- %他们又是 5 ... %再次将第 4 列的最后两个值返回到 5...
我怎样才能摆脱这个问题?这是代码;
reversecoding = myStruct.mysurvey(:,4) == 5 ;
mySturct.mysurvey(reversecoding,4) = 3 ;
% after
reversecoding = myStruct.mysurvey(:,4) == 3 ;
mySturct.mysurvey(reversecoding,4) = 5 ;
% all other values will be transformed.
%old 1 will be 7
%old 2 will be 6
...
%old 6 will be 2
%old 7 will be 1
重新编码的最佳方式是什么?我将从 1 重新编码到 7。
您可以使用 container map 创建从旧值到新值的映射。这很简单:
map = containers.Map(old_values, new_values);
或者你的情况
map = containers.Map(1:10, 10:-1:1);
然后您可以使用 map
将旧值映射到其对应的新值,如下所示:
>> map(1)
ans =
10
>> map(4)
ans =
7
请注意,您只能 "call" map
单个值,而不是数组。但是你可以使用例如arrayfun
将其简化为一次调用:
>> myStruct.mysurvey(:, 4) = [9, 2, 1, 10, 4]; % Example data
>> myStruct.mysurvey(:, 4)
ans =
9
2
1
10
4
>> myStruct.mysurvey(:, 4) = arrayfun(@(x) map(x), myStruct.mysurvey(:, 4));
>> myStruct.mysurvey(:, 4)
ans =
2
9
10
1
7
我找到了解决这个问题的另一种方法,但这有点让人头疼。
我使用逻辑索引为每个值创建了不同的变量。
%find elements to recode
fiveto3 = myStruct.mySurvey(:,4) == 5 ;
threeto5 = myStruct.mySurvey(:,4) == 3 ;
...
twoto6= myStruct.mySurvey(:,4)== 2;
sixto2= myStruct.mySurvey(:,4)== 6;
...
oneto7= myStruct.mySurvey(:,4) == 1;
sevento1 = myStruct.mySurvey(:,4)==7;
% time to recode
myStruct.mySurvey(fiveto3 , 4) = 3 ;
myStruct.mySurvey(threeto5,4) = 5 ;
myStruct.mySurvey(twoto6 , 4) = 6 ;
myStruct.mySurvey(sixto2 , 4) = 2 ;
myStruct.mySurvey(oneto7 , 4) = 7 ;
myStruct.mySurvey(sevento1 , 4) = 1 ;
clear fiveto3 threeto5 twoto6 sixto2 oneto7 sevento1 % to get rid of these variables.
这也有效,但如果要重新编码的值超过 10 个,则需要更多的努力和更多的行。你们都可以试试 container map 或者这个!