объединение имен столбцов с данными столбцов в R (с использованием data.table) - PullRequest
0 голосов
/ 04 июня 2018

У меня есть 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"))
})]

Однако я не получаю желаемый результат.Пожалуйста помоги.

Ответы [ 3 ]

0 голосов
/ 04 июня 2018

Используйте 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
0 голосов
/ 04 июня 2018

в базе 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
0 голосов
/ 04 июня 2018

Следующие работы:

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 name текущего элемента списка (имя столбца) неизвестно.Чтобы обойти это, мы перебираем столбец names , посредством чего мы можем дать себе доступ к обоим именам столбцов и к содержимому столбцов.

Часть setNames просто для удобства, ее легко разбить, если вы обнаружите, что она слишком сложна - она ​​создаст объект c(varx = 'varx', vary = 'vary'), который позволяет выводу автоматически получать правильные имена.Если мы сделаем lapply(names(.SD), ...), мы должны будем затем очистить имена столбцов.

c('n', 'y')[idx + 1L] - это довольно мутный способ сказать ifelse(idx, 'y', 'n') (одно из мест, где индексация на основе 0было бы здорово);это может быть заменено тем, что вы считаете нужным.Если ваши данные огромны, вы заметите, что моя версия быстрее .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...