我一直在互联网上讨论,并且无法弄清楚如何应用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专家来说非常容易。
答案 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]