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

将列名与R中的列数据连接(使用data.table),r,data.table,concatenation,multiple-columns,R,Data.table,Concatenation,Multiple Columns,我有一个数据表,如下所示 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

我有一个数据表,如下所示

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[,lapply(.SD, function(x){
  ifelse(x==1,paste0(.SD,"_y"),paste0(.SD,"_n"))
})]
然而,我没有得到期望的输出。请帮忙

以下工作:

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')
,这让输出自动获得正确的名称。如果我们做了
lappy(names(.SD),…)
,那么之后我们必须清理列名


c('n','y')[idx+1L]
是一种有点晦涩的说法,
ifelse(idx,'y','n')
(其中一个基于0的索引很好的地方);你认为合适的话,可以用它来代替。如果您的数据量很大,您会注意到我的版本是。

使用
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

在base
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
dt[dt==0]
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