代码之家  ›  专栏  ›  技术社区  ›  Metrics

将列名与R中的列数据连接(使用data.table)

  •  2
  • Metrics  · 技术社区  · 6 年前

    我有数据。下表:,

    library(data.table)
    
    dt<-structure(list(varx = c(0L, 1L, 0L, 0L, 1L, 0L, 1L, 0L, 0L, 0L
    ), vary = c(0L, 0L, 0L, 0L, 1L, 0L, 1L, 0L, 0L, 0L)), class = c("data.table", 
    "data.frame"), row.names = c(NA, -10L))
    dt
        varx vary
     1:    0    0
     2:    1    0
     3:    0    0
     4:    0    0
     5:    1    1
     6:    0    0
     7:    1    1
     8:    0    0
     9:    0    0
    10:    0    0
    

    我试图得到以下结果:

    dt 
        varx    vary
    1:  varx_n  vary_n
    2:  varx_y  vary_n
    3:  varx_n  vary_n
    4:  varx_n  vary_n
    5:  varx_y  vary_y
    6:  varx_n  vary_n
    7:  varx_y  vary_y
    8:  varx_n  vary_n
    9:  varx_n  vary_n
    10: varx_n  vary_n
    

    使用以下代码:

    dt[,lapply(.SD, function(x){
      ifelse(x==1,paste0(.SD,"_y"),paste0(.SD,"_n"))
    })]
    

    然而,我没有得到想要的输出。请帮忙。

    3 回复  |  直到 6 年前
        1
  •  3
  •   MichaelChirico    6 年前

    使用 Map 还有一点 factor 标记以将每个变量名与 n/y 需要标签。

    dt[, Map(paste, names(dt), lapply(.SD,factor,labels=c("n","y")), sep="_")]
    
    #      varx   vary
    # 1: varx_n vary_n
    # 2: varx_y vary_n
    # 3: varx_n vary_n
    # 4: varx_n vary_n
    # 5: varx_y vary_y
    # 6: varx_n vary_n
    # 7: varx_y vary_y
    # 8: varx_n vary_n
    # 9: varx_n vary_n
    #10: varx_n vary_n
    
        2
  •  6
  •   thelatemail    6 年前

    以下工作:

    dt[ , lapply(setNames(nm = names(.SD)), function(nm_j) 
      sprintf('%s_%s', nm_j, c('n', 'y')[.SD[[nm_j]] + 1L]))]
    #       varx   vary
    #  1: varx_n vary_n
    #  2: varx_y vary_n
    #  3: varx_n vary_n
    #  4: varx_n vary_n
    #  5: varx_y vary_y
    #  6: varx_n vary_n
    #  7: varx_y vary_y
    #  8: varx_n vary_n
    #  9: varx_n vary_n
    # 10: varx_n vary_n
    

    你的方法的问题是 lapply(.SD, ...) ,在 FUN 这个 名称 当前列表元素的名称(即列名)未知。为了绕开这一点,我们绕了一圈 名字 这样我们就可以获得 二者都 列名 列的内容。

    这个 setNames 部分只是为了方便起见,如果你发现它太高尔菲代码,它很容易被破解——它将创建一个对象 c(varx = 'varx', vary = 'vary') ,它可以让输出自动获得正确的名称。如果我们这样做了 lapply(names(.SD), ...) ,之后我们必须清理列名。

    c('n', 'y')[idx + 1L] 这有点晦涩难懂 ifelse(idx, 'y', 'n') (其中一个基于0的索引很好的地方);如果你觉得合适,可以用它来代替。如果你的数据是海量的,你会注意到我的版本是 faster .

        3
  •  2
  •   moodymudskipper    6 年前

    在基地 R :

    dt[dt==0] <- "_n" 
    dt[dt=="1"] <- "_y" 
    dt[] <- Map(paste0,names(dt),dt)
    #       varx   vary
    #  1: varx_n vary_n
    #  2: varx_y vary_n
    #  3: varx_n vary_n
    #  4: varx_n vary_n
    #  5: varx_y vary_y
    #  6: varx_n vary_n
    #  7: varx_y vary_y
    #  8: varx_n vary_n
    #  9: varx_n vary_n
    # 10: varx_n vary_n