【问题标题】:Using `car` to recode across range of columns使用 `car` 跨列范围重新编码
【发布时间】:2013-04-23 21:02:16
【问题描述】:

我一直在互联网上闲逛,不知道如何应用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"))

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

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

【问题讨论】:

    标签: r dataframe data.table


    【解决方案1】:

    也许有更多的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
    

    【讨论】:

    • 如果我想使用变量名而不是列号?
    【解决方案2】:

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

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

    按列号来做:

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

    【讨论】:

    • 谢谢!您能否快速解释一下为什么这在 data.table 中不起作用?我必须重新转换为 data.frame 才能使其工作,并且进一步了解为什么会这样会很棒:)
    • [&lt;-.data.table 语法与[&lt;-.data.frame 语法完全不同。我没有注意到 data.table 是问题的一部分。如果你以后发布一个测试用例,你会得到更好的答案。
    • 对于数据帧,你会像 library(dplyr) df_2
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-06
      • 1970-01-01
      • 1970-01-01
      • 2013-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多