[英]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.