【问题标题】:Reverse Scoring Items反向计分项目
【发布时间】:2015-01-08 18:29:45
【问题描述】:

我对大约 80 个项目进行了调查,主要是这些项目是正价的(分数越高表明结果越好),但其中大约 20 个是负价,我需要找到一种方法来反转 R 中负价的项目.我完全不知道该怎么做。我绝对是一个 R 初学者,这可能是一个愚蠢的问题,但是有人可以在代码方面为我指出一个方向吗?

【问题讨论】:

  • 你说的valanced是什么意思?
  • 我的意思是分数越高表明结果越好(例如 1-5 的李克特量表;“5”= 非常同意某项陈述)。但是对于他们中的一些人来说,李克特量表上的“1”表示强烈同意(这将是负面的)。我对它们进行反向评分,因此对于每个项目,更高的分数表示更强的一致性。 @ScottChamberlain
  • 我的意思是说“我需要”对它们进行反向评分。
  • 这个问题的新手可能希望向下滚动一点到基于 tidyverse 的解决方案

标签: r reverse scoring


【解决方案1】:

下面是一些假数据示例,您可以根据自己的数据进行调整:

# Fake data: Three questions answered on a 1 to 5 scale
set.seed(1)
dat = data.frame(Q1=sample(1:5,10,replace=TRUE), 
                 Q2=sample(1:5,10,replace=TRUE),
                 Q3=sample(1:5,10,replace=TRUE))

dat
   Q1 Q2 Q3
1   2  2  5
2   2  1  2
3   3  4  4
4   5  2  1
5   2  4  2
6   5  3  2
7   5  4  1
8   4  5  2
9   4  2  5
10  1  4  2

# Say you want to reverse questions Q1 and Q3
cols = c("Q1", "Q3")

dat[ ,cols] = 6 - dat[ ,cols]

dat
   Q1 Q2 Q3
1   4  2  1
2   4  1  4
3   3  4  2
4   1  2  5
5   4  4  4
6   1  3  4
7   1  4  5
8   2  5  4
9   2  2  1
10  5  4  4

如果您有很多列,可以使用tidyverse 函数在一次操作中选择多个列进行重新编码。

library(tidyverse)

# Reverse code columns Q1 and Q3
dat %>% mutate(across(matches("^Q[13]"), ~ 6 - .))

# Reverse code all columns that start with Q followed by one or two digits
dat %>% mutate(across(matches("^Q[0-9]{1,2}"), ~ 6 - .))

# Reverse code columns Q11 through Q20
dat %>% mutate(across(Q11:Q20, ~ 6 - .))

如果不同的列可能有不同的最大值,您可以(适应@HellowWorld 的建议)将反向编码自定义为每列的最大值:

# Reverse code columns Q11 through Q20 
dat %>% mutate(across(Q11:Q20, ~ max(.) + 1 - .))

【讨论】:

  • 非常感谢,这行得通,是我真正能理解的。 @eipi10
  • 对于将来发现此问题的任何人,psych 包有一个名为 reverse.code() 的函数,它可以执行此操作。
  • 将 6 替换为 'max(dat[, cols]) + 1' 将代码扩展到其他情况并防止为一个函数调用加载库
【解决方案2】:

这是使用 psych 包的另一种方法。如果你正在处理调查数据,这个包有很多很好的功能。以@eipi10 数据为基础:

# Fake data: Three questions answered on a 1 to 5 scale
set.seed(1)
original_data = data.frame(Q1=sample(1:5,10,replace=TRUE), 
                 Q2=sample(1:5,10,replace=TRUE),
                 Q3=sample(1:5,10,replace=TRUE))
original_data

# Say you want to reverse questions Q1 and Q3. Set those keys to -1 and Q2 to 1.
# install.packages("psych") # Uncomment this if you haven't installed the psych package
library(psych)
keys <- c(-1,1,-1)

# Use the handy function from the pysch package
# mini is the minimum value and maxi is the maimum value
# mini and maxi can also be vectors if you have different scales
new_data <- reverse.code(keys,original_data,mini=1,maxi=5)
new_data

这种方法的优点是您可以在一个函数中重新编码整个调查。缺点是你需要一个图书馆。库存 R 方法也更优雅。

仅供参考,这是我关于堆栈溢出的第一篇文章。长期聆听者,第一次来电者。所以请就我的回复给我反馈。

【讨论】:

    【解决方案3】:

    只需使用 tidyverse 转换 @eipi10 的答案:

    # Create same fake data: Three questions answered on a 1 to 5 scale
    set.seed(1)
    dat <- data.frame(Q1 = sample(1:5,10, replace=TRUE), 
                      Q2 = sample(1:5,10, replace=TRUE),
                      Q3 = sample(1:5,10, replace=TRUE))
    
    # Reverse scores in the desired columns (Q2 and Q3)
    
    dat <- dat %>% 
      mutate(Q2Reversed = 6 - Q2,
             Q3Reversed = 6 - Q3)
    

    【讨论】:

      【解决方案4】:

      另一个例子是在 library(car) 中使用 recode。

       #Example data
       data = data.frame(Q1=sample(1:5,10, replace=TRUE))
      
       # Say you want to reverse questions Q1
       library(car)
       data$Q1reversed <- recode(data$Q1, "1=5; 2=4; 3=3; 4=2; 5=1")
       data
      

      【讨论】:

        【解决方案5】:

        psych 包具有直观的 reverse.code() 功能,非常有用。使用@eipi10开始的数据集,目标相同或者q1和q2颠倒:

        set.seed(1)
        dat <- data.frame(q1 =sample(1:5,10,replace=TRUE), 
                         q2=sample(1:5,10,replace=TRUE),
                         q3 =sample(1:5,10,replace=TRUE))
        

        您可以使用 reverse.code() 函数。第一个参数是键。这是一个 1 和 -1 的向量。 -1 表示您要反转该项目。它们的顺序与您的数据相同。

        第二个参数称为 items,只是数据集的名称。也就是说,这些物品在哪里?

        最后,mini 和 maxi 参数是参与者可能得分的最小值和最大值。您也可以将这些参数保留为 NULL,该函数将使用数据中的最低值和最高值。

        library(psych)
        keys <- c(-1, 1, -1)
        dat1 <- reverse.code(keys = keys, items = dat, mini = 1, maxi = 5)
        
        dat1
        

        或者,您的键还可以包含要反转分数的变量的特定名称。如果您有许多变量来反转得分并产生相同的答案,这将很有帮助:

        library(psych)
        keys <- c("q1", "q3")
        dat2 <- reverse.code(keys = keys, items = dat, mini = 1, maxi = 5)
        
        dat2
        

        请注意,反向评分后,reverse.code() 会稍微修改变量名,使其后面带有 - (即反向评分后 q1 变为 q1-)。

        【讨论】:

          【解决方案6】:

          上述解决方案假设数据范围很广(每列一个分数)。这种反向对长数据中的特定行进行评分(每行一个分数)。

          library(magrittr)
          max <- 5
          df <- data.frame(score=sample(1:max, 20, replace=TRUE))
          df <- mutate(df, question = rownames(df))
          df
          df[c(4,13,17),] %<>% mutate(score = max + 1 - score)
          df
          

          【讨论】:

            【解决方案7】:

            这是另一个可以推广到任意数量列的尝试。让我们用一些虚构的数据来说明这个功能。

            # create a df
            {
            A = c(3, 3, 3, 3, 3, 3, 3, 3, 3, 3)
            B = c(9, 2, 3, 2, 4, 0, 2, 7, 2, 8)
            C = c(2, 4, 1, 0, 2, 1, 3, 0, 7, 8)
            
            df1 = data.frame(A, B, C)
            print(df1)
            }
               A B C
            1  3 9 2
            2  3 2 4
            3  3 3 1
            4  3 2 0
            5  3 4 2
            6  3 0 1
            7  3 2 3
            8  3 7 0
            9  3 2 7
            10 3 8 8
            

            要反转代码的列

            # variables to reverse code
            vtcode = c("A", "B")
            

            对所选列进行反向编码的功能

            reverseCode <- function(data, rev){
              
              # get maximum value per desired col: lapply(data[rev], max)
              # subtract values in cols to reverse-code from max value plus 1
              data[, rev] = mapply("-", lapply(data[rev], max), data[, rev]) + 1
              
              return(data)
              
            }
            
            
            reverseCode(df1, vtcode)
            
               A  B C
            1  1  1 2
            2  1  8 4
            3  1  7 1
            4  1  8 0
            5  1  6 2
            6  1 10 1
            7  1  8 3
            8  1  3 0
            9  1  8 7
            10 1  2 8
            

            此代码的灵感来自另一个回复,即来自 @catastrophic-failure 的与 subtract max of column from all entries in column R 相关的回复

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2014-11-26
              • 2019-09-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-09-19
              相关资源
              最近更新 更多