反向评分项目

时间:2014-11-12 01:51:35

标签: r reverse scoring

我对大约80个项目进行了调查,主要是项目是平衡的(更高的分数表示更好的结果),但其中大约20个是负面平衡的,我需要找到一种方法来反转R中负面平衡的那些。我完全迷失了怎么做。我绝对是一个R初学者,这可能是一个愚蠢的问题,但是有人能指出我的代码方向吗?

7 个答案:

答案 0 :(得分:7)

以下是一些可以适应您的数据的虚假数据示例:

# 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")

# Reverse scores in the desired columns 
dat[,cols] = lapply(cols,  function(x) 6 - dat[, x])

# Per @akrun's comment, I was making it more complicated than necessary. 
# You can just do this instead of the `lapply` thing above:
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

答案 1 :(得分:3)

这是使用心理包的另一种方法。如果您正在使用调查数据,这个包有很多好的功能。建立在@ 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方法也更优雅。

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

答案 2 :(得分: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)

答案 3 :(得分:1)

另一个例子是在库(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

答案 4 :(得分:0)

上面的解决方案假定使用宽数据(每列一个分数)。这样可以对长数据中的特定行进行评分(每行一个评分)。

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

答案 5 :(得分:0)

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表示您要撤消该项目。它们的顺序与您的数据相同。

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

最后,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 :(得分:0)

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

# 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-failuresubtract max of column from all entries in column R

相关的另一个回复