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 或者这个!