【发布时间】:2018-03-26 17:48:00
【问题描述】:
我有一个包含 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 变成 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)]
然后对这个子集进行反向编码:
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))
这成功了。现在所有变量都像我需要的那样被反向编码。但是,我如何获得这个反向编码值的子集并将其放回原始数据框中 - 覆盖旧的(非反向)列?
任何帮助将不胜感激,谢谢!
编辑 - 解决方案
我想我已经设法在@MikeH 的帮助下解决了这个问题。
我创建了参与者 ID 的子集(因子变量)data_ID <- df[1]
然后使用:
data_rev <- reverse.code(keys, items = df[,-1], mini = rep(1,46), maxi = rep(5,46))
这给我留下了 2 个数据框/子集:
- 1 包含所有参与者 ID。
- 1 及其所有数据和列
5,6,8,9,10,12,13,14,17和18反向编码。
然后我使用:data_final <- cbind(data_ID, data_rev) 将 2 个子集重新连接在一起。
有人能看出这种方法有什么问题吗?我认为它已经通过目视检查...
【问题讨论】:
-
abs(df[c(5,6,8,9,10,12,13,14,17,18)] - 6)做吗? -
我可以通过在数据中存在因子来复制您的错误(即使您没有重新编码)。你可以试试:
reverse.code(keys[-1], items = df[,-1], mini = rep(1,49), maxi = rep(5,49)) -
@rawr 不好意思……但这行代码到底在做什么?取这些列的绝对值并从中减去 6?
-
穆迪的回答是一样的,而且更直观
-
@MikeH。非常感谢!请参阅我原始帖子中的上述编辑,了解我是如何解决它的。再次感谢你的帮助!希望我能以某种方式为你 +1