создание вектора из нескольких данных.табличные входы в R

#r #data.table #lapply

#r #данные.таблица #lapply

Вопрос:

Я пытаюсь создать вектор, содержащий объединенную информацию из data.table вызываемого runVars :

 runVars
    calculationType calculateHCC cutOffTime historyCutOff numberOfHistroicalYears
 1:        COMPLETE         TRUE          9         FALSE                       1
 2:        COMPLETE         TRUE          9         FALSE                       2
 3:        COMPLETE         TRUE          9         FALSE                       1
 4:        COMPLETE         TRUE          9         FALSE                       2
 5:        COMPLETE         TRUE         10         FALSE                       1
 6:        COMPLETE         TRUE         10         FALSE                       2
 7:        COMPLETE         TRUE         10         FALSE                       1
 8:        COMPLETE         TRUE         10         FALSE                       2
 9:        COMPLETE        FALSE          9         FALSE                       1
10:        COMPLETE        FALSE          9         FALSE                       2
11:        COMPLETE        FALSE          9         FALSE                       1
12:        COMPLETE        FALSE          9         FALSE                       2
13:        COMPLETE        FALSE         10         FALSE                       1
14:        COMPLETE        FALSE         10         FALSE                       2
15:        COMPLETE        FALSE         10         FALSE                       1
16:        COMPLETE        FALSE         10         FALSE                       2
  

вектор, который я хочу создать, должен выглядеть примерно так:

  [1] "histyears1_hcc1_histcut0_9m_COMPLETE"  "histyears2_hcc1_histcut0_9m_COMPLETE"  "histyears1_hcc1_histcut0_9m_COMPLETE"  "histyears2_hcc1_histcut0_9m_COMPLETE" 
 [5] "histyears1_hcc1_histcut0_10m_COMPLETE" "histyears2_hcc1_histcut0_10m_COMPLETE" "histyears1_hcc1_histcut0_10m_COMPLETE" "histyears2_hcc1_histcut0_10m_COMPLETE"
 [9] "histyears1_hcc0_histcut0_9m_COMPLETE"  "histyears2_hcc0_histcut0_9m_COMPLETE"  "histyears1_hcc0_histcut0_9m_COMPLETE"  "histyears2_hcc0_histcut0_9m_COMPLETE" 
[13] "histyears1_hcc0_histcut0_10m_COMPLETE" "histyears2_hcc0_histcut0_10m_COMPLETE" "histyears1_hcc0_histcut0_10m_COMPLETE" "histyears2_hcc0_histcut0_10m_COMPLETE"
  

Я создал этот вектор, используя подход data.table:

 setDT(runVars)
runVars[,runName := paste0("histyears", numberOfHistroicalYears, "_hcc", as.integer(calculateHCC),
                  "_histcut", as.integer(historyCutOff), "_", cutOffTime, "m_", calculationType)]
subset <- runVars$runName
  

Однако мне это не очень нравится, кажется каким-то неуклюжим. Я выбирал lapply() , но я не могу понять, что с ним не так?

 subset <- lapply(runVars, function(x){
  paste0("histyears", x$numberOfHistroicalYears, "_hcc", as.integer(x$calculateHCC),
                  "_histcut", as.integer(x$historyCutOff), "_", x$cutOffTime, "m_", x$calculationType)
})
  

Ошибка в x$numberOfHistroicalYears : оператор $ недопустим для
атомарные векторы

Есть идеи, как это исправить?

Комментарии:

1. Можете ли вы предоставить общий доступ к данным в формате копирования и вставки? ИМХО, ваш первый подход кажется довольно простым. Вы могли бы рассмотреть, sprintf вместо paste что может быть более элегантным.

2. Эта ошибка связана с тем, что lapply выполняется над вашими столбцами (векторами, которые являются x в вашей функции), и вы не можете использовать $ для вектора. do.call(paste0, ...) в данном случае это правильный подход.

Ответ №1:

То, что у вас есть, правильно, вы не должны использовать lapply здесь.

Вот еще один вариант с sprintf , который может быть короче.

 library(data.table)
runVars[,runName := sprintf("histyears%s_hcc%d_histcut%d_%sm_%s",
           numberOfHistroicalYears, as.integer(calculateHCC),
           as.integer(historyCutOff), cutOffTime, calculationType)]
runVars$runName

# [1] "histyears1_hcc1_histcut0_9m_COMPLETE"  "histyears2_hcc1_histcut0_9m_COMPLETE" 
# [3] "histyears1_hcc1_histcut0_9m_COMPLETE"  "histyears2_hcc1_histcut0_9m_COMPLETE" 
# [5] "histyears1_hcc1_histcut0_10m_COMPLETE" "histyears2_hcc1_histcut0_10m_COMPLETE"
# [7] "histyears1_hcc1_histcut0_10m_COMPLETE" "histyears2_hcc1_histcut0_10m_COMPLETE"
# [9] "histyears1_hcc0_histcut0_9m_COMPLETE"  "histyears2_hcc0_histcut0_9m_COMPLETE" 
#[11] "histyears1_hcc0_histcut0_9m_COMPLETE"  "histyears2_hcc0_histcut0_9m_COMPLETE" 
#[13] "histyears1_hcc0_histcut0_10m_COMPLETE" "histyears2_hcc0_histcut0_10m_COMPLETE"
#[15] "histyears1_hcc0_histcut0_10m_COMPLETE" "histyears2_hcc0_histcut0_10m_COMPLETE"
  

Ответ №2:

вот мой ответ… также используется sprintf() , но немного другой подход

 #setup sprintf-string
string_format <- "histyears%s_hcc%s_histcut%s_%sm_%s"
#what columns to use
cols <- c("numberOfHistroicalYears", "calculateHCC", "historyCutOff", "cutOffTime", "calculationType")
#run
DT[, do.call(sprintf, c(.SD, fmt = string_format)), .SDcols = cols]
# [1] "histyears1_hccTRUE_histcutFALSE_9m_COMPLETE"   "histyears2_hccTRUE_histcutFALSE_9m_COMPLETE"  
# [3] "histyears1_hccTRUE_histcutFALSE_9m_COMPLETE"   "histyears2_hccTRUE_histcutFALSE_9m_COMPLETE"  
# [5] "histyears1_hccTRUE_histcutFALSE_10m_COMPLETE"  "histyears2_hccTRUE_histcutFALSE_10m_COMPLETE" 
# [7] "histyears1_hccTRUE_histcutFALSE_10m_COMPLETE"  "histyears2_hccTRUE_histcutFALSE_10m_COMPLETE" 
# [9] "histyears1_hccFALSE_histcutFALSE_9m_COMPLETE"  "histyears2_hccFALSE_histcutFALSE_9m_COMPLETE" 
# [11] "histyears1_hccFALSE_histcutFALSE_9m_COMPLETE"  "histyears2_hccFALSE_histcutFALSE_9m_COMPLETE" 
# [13] "histyears1_hccFALSE_histcutFALSE_10m_COMPLETE" "histyears2_hccFALSE_histcutFALSE_10m_COMPLETE"
# [15] "histyears1_hccFALSE_histcutFALSE_10m_COMPLETE" "histyears2_hccFALSE_histcutFALSE_10m_COMPLETE"