我有一个包含49列的数据集。
'data.frame': 1351 obs. of 47 variables:
$ ID : Factor w/ 1351 levels "PID0001","PID0002",..: 1 2 3 4 5 6 7 8 9 10 ...
$ Survey: int 1 2 1 1 2 2 2 1 1 2 ...
$ hsinc1: int 2 4 4 4 5 4 3 3 1 1 ...
$ hsinc2: int 2 3 3 3 4 3 3 3 1 1 ...
$ hsinc3: int 4 4 2 3 3 4 5 4 5 5 ...
$ hsinc4: int 4 4 4 4 4 4 4 4 5 4 ...
$ hfair1: int 2 2 2 1 1 1 1 2 1 2 ...
$ hfair2: int 4 5 5 4 5 5 5 5 5 5 ...
$ hfair3: int 4 5 4 3 5 4 3 3 5 5 ...
等...
我想反转代码列5,6,8,9,10,12,13,14,17
和18
,以使分数5
成为1
得分,4
成为{{1}等等。
起初,我认为使用2
函数可以实现这一点,所以我尝试了这个:
psych::reverse.code()
列为-1
和5,6,8,9,10,12,13,14,17
列。
18
但是,当我运行此代码时,我收到以下错误:
library('psych')
keys <-c(1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1)
df_rev <- reverse.code(keys, items = df, mini = rep(1,49), maxi = rep(5,49))
有人可以帮忙吗?
我刚刚尝试的另一种方法是创建原始数据框的子集,只有我想要反转代码的列:
Error in items %*% keys.d :
requires numeric/complex matrix/vector arguments
然后反编码这个子集:
data_to_rev <- df[c(5,6,8,9,10,12,13,14,17,18)]
这很有效。所有变量现在都反向编码,就像我需要它们一样。但是,如何获取反向编码值的这个子集并将其放回原始数据框中 - 覆盖旧(非反转)列?
非常感谢任何帮助,谢谢!
编辑 - 解决方案
我想我已经设法使用@ MikeH的帮助来解决它。
我创建了参与者ID的子集(因子变量)keys <- c(-1,-1,-1,-1,-1,-1,-1,-1,-1,-1)
df_rev <- reverse.code(keys, items = data_to_rev, mini = rep(1,10), maxi = rep(5,10))
然后使用:
data_ID <- df[1]
这给我留下了2个数据帧/子集:
data_rev <- reverse.code(keys, items = df[,-1], mini = rep(1,46), maxi = rep(5,46))
和5,6,8,9,10,12,13,14,17
反向编码。 然后我使用:18
将两个子集重新加入。
有人能看到这种方法有什么问题吗?我认为它已经用于视觉检查...
答案 0 :(得分:2)
df[c(5,6,8,9,10,12,13,14,17)] <- 6 - df[c(5,6,8,9,10,12,13,14,17)]
答案 1 :(得分:0)
一种有效的方法是自己编写反向函数并将其应用于您想要的列
Stack
或者
library(data.table)
start=1
end=5
myrev=function(x) end+start-x
dt=data.table(x=c(1,2,1,4),y=c(2,5,4,1))
cols=1:2
dt[, (cols) := lapply(.SD,myrev), .SDcols = cols]