代码之家  ›  专栏  ›  技术社区  ›  Likan Zhan

基于data.table中一列的值更改多列的值

  •  3
  • Likan Zhan  · 技术社区  · 6 年前

    假设我有一个数据表, dt1 :

    dt1 <- data.table(
    names = c("A1", "XX", "A2", "XY", "A3", "XZ"),
       A1 = c( 0,    0,    0,    0,    0,    0), 
       A2 = c( 0,    0,    0,    0,    0,    0), 
       A3 = c( 0,    0,    0,    0,    0,    0)
    )
    

    dt2 <- data.table(
    names = c("A1", "XX", "A2", "XY", "A3", "XZ"),
       A1 = c( 1,    0,    0,    0,    0,    0), 
       A2 = c( 0,    0,    1,    0,    0,    0), 
       A3 = c( 0,    0,    0,    0,    1,    0)
    )
    

    i、 e,如果列的行值 names 与某列的名称相同,则该列的行值更改为 1 .

    dt1[names == "A1", "A1" := 1]
    dt1[names == "A2", "A2" := 1]
    dt1[names == "A3", "A3" := 1]
    

    但我想知道是否有一种更简单的方法可以做到这一点,特别是当我想更改的列数很大时。

    cln <- c("A1", "A2", "A3")
    dt1[names == (cln), (cln) := 1]
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   Jaap    6 年前

    使用高效的 for(...) set(...) 组合

    for(j in names(dt1)[-1]) {
      set(dt1, dt1[, .I[names == j]], j, value = 1)
    }
    

    它给出:

    > dt1
       names A1 A2 A3
    1:    A1  1  0  0
    2:    XX  0  0  0
    3:    A2  0  1  0
    4:    XY  0  0  0
    5:    A3  0  0  1
    6:    XZ  0  0  0
    

    names(dt1)[-1] setdiff(names(dt1), "names") .

        2
  •  0
  •   Jaap    6 年前

    for(i in colnames(dt1)[-1]) {
     dt1[,i] <- ifelse(dt1[,"names"] == i, 1, 0)
    }