【问题标题】:Reverse Coding Certain Columns in R反向编码 R 中的某些列
【发布时间】: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,1718,使 5 的分数变成 1 的分数,4 变成 2 等等。

起初,我认为使用psych::reverse.code()函数可以实现,所以我尝试了这个:

-15,6,8,9,10,12,13,14,1718 列。

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 &lt;- df[1]

然后使用:

data_rev &lt;- 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,1718 反向编码。

然后我使用:data_final &lt;- 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

标签: r merge subset reverse


【解决方案1】:
df[c(5,6,8,9,10,12,13,14,17)] <- 6 - df[c(5,6,8,9,10,12,13,14,17)] 

【讨论】:

    【解决方案2】:

    一种有效的方法是自己编写反向函数并将其应用于您想要的列

    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]
    

    或者

    dt[, (cols) := end + start-cols]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-16
      • 1970-01-01
      • 1970-01-01
      • 2017-04-07
      • 2017-07-09
      • 1970-01-01
      相关资源
      最近更新 更多