使用`car`重新编码列范围

时间:2013-04-23 21:02:17

标签: r dataframe data.table

我一直在互联网上讨论,并且无法弄清楚如何应用car来重新编码一系列列的值。

要重新编码单个列的值,我将运行如下命令:

 df$dv_r <- recode(df$dv, "2=1;1=0;0=NA")

然后,如果我想为整个data.frame执行此操作,我可以运行:

 df_2 <- lapply(df, FUN = function(x) recode(x, "2=1;1=0;0=NA"))

但是,我不确定如何为一系列列执行此操作 - 例如,在假设的data.table df中,我将如何重新编码20:40范围内的列的值1}}?

谢谢!当然这对R专家来说非常容易。

3 个答案:

答案 0 :(得分:6)

也许有更多的data.table方法可以做到这一点,但这里有一种可能性:

library(data.table)
library(car)

## Here is some sample data
set.seed(1)
dt <- data.table(A = sample(0:2, 10, replace = TRUE), 
                 B = sample(0:2, 10, replace = TRUE),
                 C = sample(0:2, 10, replace = TRUE),
                 D = rnorm(10), E = rnorm(10), ID = 1:10)
dt
#     A B C           D           E ID
#  1: 0 0 2 -0.04493361 -0.05612874  1
#  2: 1 0 0 -0.01619026 -0.15579551  2
#  3: 1 2 1  0.94383621 -1.47075238  3
#  4: 2 1 0  0.82122120 -0.47815006  4
#  5: 0 2 0  0.59390132  0.41794156  5
#  6: 2 1 1  0.91897737  1.35867955  6
#  7: 2 2 0  0.78213630 -0.10278773  7
#  8: 1 2 1  0.07456498  0.38767161  8
#  9: 1 1 2 -1.98935170 -0.05380504  9
# 10: 0 2 1  0.61982575 -1.37705956 10

使用.SDcols定义要将函数应用到的列。

dt[, 1:3 := lapply(.SD, recode, "2=1;1=0;0=NA"), .SDcols = 1:3]
dt
#      A  B  C           D           E ID
#  1: NA NA  1 -0.04493361 -0.05612874  1
#  2:  0 NA NA -0.01619026 -0.15579551  2
#  3:  0  1  0  0.94383621 -1.47075238  3
#  4:  1  0 NA  0.82122120 -0.47815006  4
#  5: NA  1 NA  0.59390132  0.41794156  5
#  6:  1  0  0  0.91897737  1.35867955  6
#  7:  1  1 NA  0.78213630 -0.10278773  7
#  8:  0  1  0  0.07456498  0.38767161  8
#  9:  0  0  1 -1.98935170 -0.05380504  9
# 10: NA  1  0  0.61982575 -1.37705956 10

答案 1 :(得分:2)

当然可以。事实上,仅在data.frame的子集上进行操作可以避免重做data.frame调用:

  df_2[ , col_names]  <- lapply(df[ ,colnames] , 
                                FUN = function(x) recode(x, "2=1;1=0;0=NA"))

用col-number做的:

  df_2[ , 20:40]  <- lapply(df[ ,20:40] , 
                                FUN = function(x) recode(x, "2=1;1=0;0=NA"))

答案 2 :(得分:0)

使用变量名而不是列号将类似于:

cnames <- c("A", "B", "C")    
dt[ , cnames := lapply(dt[,cnames,with=FALSE], 
recode, "2=1;1=0;0=NA"), with=FALSE]