簡體   English   中英

將列名與R中的列數據連接(使用data.table)

[英]concatenating column names with column data in R (using data.table)

我有一個data.table如下,

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"))
})]

但是,我沒有得到所需的輸出。 請幫忙。

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

以下作品:

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的索引會很好的地方之一) ; 它可以根據您的需要替換。 如果您的數據量很大,您會發現我的版本更快

在基地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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM