【问题标题】:R DataTable Recode Many VariablesR DataTable 重新编码许多变量
【发布时间】:2023-04-07 05:04:02
【问题描述】:
data=data.frame("cat" = sample(c('a','b'), 100, r=T),
                "dog" = sample(c('a','b'), 100, r=T),
                "bark" = sample(c(1:1000), 100, r=T),
                "fox" = sample(c('a','b'), 100, r=T))

library(data.table)
setDT(data)

是否可以将 cat、dog、fox 中的 'a' 替换为 -9 并将 'b' 替换为 9?我希望同时执行此操作并使用 data.table 中列的名称

【问题讨论】:

  • 是这些因素变量

标签: r data.table


【解决方案1】:

如果这些是字符列,则选项是set

for(nm1 in c('cat', 'dog', 'fox')) {
   set(data, i = which(data[[nm1]] == 'a'), j= nm1, value = -9)
   set(data, i = which(data[[nm1]] == 'b'), j= nm1, value = 9)
  }

或者另一种选择是

nm1 <- c('cat', 'dog', 'fox')
data[, (nm1) := lapply(.SD, function(x)  
          setNames(c(-9, 9), c('a', 'b'))[x]), .SDcols =nm1]

数据

set.seed(24)
data=data.frame("cat" = sample(c('a','b'), 100, replace=TRUE),
                "dog" = sample(c('a','b'), 100, replace=TRUE),
                "bark" = sample(c(1:1000), 100, replace=TRUE),
                "fox" = sample(c('a','b'), 100, replace=TRUE), stringsAsFactors = FALSE)

【讨论】:

    【解决方案2】:

    1) 使用 Note 中的设置可以转换所有字符列。

    DT[, lapply(.SD, function(x) if (is.character(x)) c(a = 9, b = -9)[x] else x)]
    

    给予:

        cat dog bark fox
     1:   9  -9  890  -9
     2:  -9   9  693  -9
     3:   9  -9  641  -9
     4:  -9  -9  995  -9
     5:  -9   9  656   9
     6:   9  -9  709   9
     7:  -9   9  545  -9
     8:  -9   9  595   9
     9:  -9   9  290   9
    10:   9  -9  148   9
    

    2)如果您有其他字符列并且只想更改只有“a”和“b”的列,那么:

     DT[, lapply(.SD, function(x) 
       if (is.character(x) && all(x %in% c("a", "b"))) c(a = 9, b = -9)[x] else x)]
    

    3) 名称 如果您希望明确指定列名,则可以使用此替代方法。这会将DT 修改为所需的形式。

     nms <- c("cat", "dog", "fox")
     DT[, c(nms):=lapply(.SD, function(x) c(a = 9, b = -9)[x]), .SDcols = nms]
    

    注意

    library(data.table)
    set.seed(123)
    DT <- data.table("cat" = sample(c('a','b'), 10, TRUE),
                    "dog" = sample(c('a','b'), 10, TRUE),
                    "bark" = sample(c(1:1000), 10, TRUE),
                    "fox" = sample(c('a','b'), 10, TRUE))
    

    【讨论】:

      【解决方案3】:

      另一种选择是:

      cols <- c("cat", "dog", "fox")
      DT[, (cols) := {
          m <- as.matrix(.SD)
          m[m=='a'] <- 9
          m[m=='b'] <- -9
          as.data.table(m)
      }, .SDcols=cols]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-18
        • 1970-01-01
        相关资源
        最近更新 更多