Mam dane.Table w następujący sposób,

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

I próbuję uzyskać następujące wyjście:

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

Korzystanie z następującego kodu:

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

Jednak nie otrzymuję pożądanego wyjścia. Proszę pomóż.

2
Metrics 4 czerwiec 2018, 09:05

3 odpowiedzi

Najlepsza odpowiedź

Następujące prace:

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

Problem z podejściem jest to, że w lapply(.SD, ...) w zakresie FUN nazwa bieżącego elementu listy (tj. Nazwa kolumny) jest nieznana. Aby to ominąć, pętlamy na kolumnie nazwy , w którym możemy dać sobie uzyskać dostęp do zarówno nazwy kolumn i zawartość kolumn.

Część setNames jest po prostu dla wygody, można go łatwo rozbić, jeśli znajdziesz go zbyt kod-golfy - utworzy obiekt c(varx = 'varx', vary = 'vary'), który pozwala automatycznie wyjść automatycznie uzyskać odpowiednie nazwy. Jeśli zrobimy lapply(names(.SD), ...), będziemy musieli posprzątać nazwy kolumn później.

c('n', 'y')[idx + 1L] jest trochę mroczny sposób mówienia ifelse(idx, 'y', 'n') (jeden z miejsc, w których indeksowanie 0 oparte na 0; Można go zastąpić, ponieważ widzisz dopasowanie. Jeśli Twoje dane są masywne, zauważysz, że moja wersja jest szybciej.

3
MichaelChirico 4 czerwiec 2018, 06:39

Użyj Map i nieco factor etykietowanie, aby sparować każdą nazwę zmiennej z wymaganą etykietą {x2}}.

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
6
thelatemail 4 czerwiec 2018, 06:22

W bazie 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
2
Moody_Mudskipper 4 czerwiec 2018, 08:34