将列名与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