反向编码R中的某些列

时间:2018-03-26 17:48:01

标签: r merge subset reverse

我有一个包含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,1718,以使分数5成为1得分,4成为{{1}等等。

起初,我认为使用2函数可以实现这一点,所以我尝试了这个:

psych::reverse.code()列为-15,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个数据帧/子集:

  • 1,包含所有参与者ID
  • 1,其所有数据和列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将两个子集重新加入。

有人能看到这种方法有什么问题吗?我认为它已经用于视觉检查...

2 个答案:

答案 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]