我对大约80个项目进行了调查,主要是项目是平衡的(更高的分数表示更好的结果),但其中大约20个是负面平衡的,我需要找到一种方法来反转R中负面平衡的那些。我完全迷失了怎么做。我绝对是一个R初学者,这可能是一个愚蠢的问题,但是有人能指出我的代码方向吗?
答案 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-failure
与 subtract max of column from all entries in column R