У меня есть следующий код, который работает на фрейме данных

 test %>% mutate_at(vars(starts_with('1'), starts_with('2')), `/`, quote(Unit))

Тем не менее я пытаюсь перенести его в data.table из-за размера test, чтобы набрать скорость. Я начал с выбора столбцов как:

test[, .SD, .SDcols = names(test) %like% "1|2"]

Но я изо всех сил пытаюсь разработать функцию для деления на Unit. Может кто-нибудь помочь

0
richpiana 25 Апр 2020 в 12:10

2 ответа

Лучший ответ

Воспроизводимый пример поможет. Из того, что я понял в вашей проблеме, вы хотите разделить некоторые столбцы, начиная с 1 или 2 , на какой-то другой столбец.

Я покажу вам пример того, что можно сделать

df = data.table(
  "Unite" = 2L,
  "1y" = rnorm(10),
  "2y" = rnorm(10)
)
df
    Unite         1y         2y
 1:     2 -1.4745875  1.1462019
 2:     2 -0.9258819  1.3628202
 3:     2  1.4676818 -0.5624427
 4:     2 -0.2385211 -1.1704368
 5:     2 -0.3172192  0.9186491
 6:     2  1.5307232 -1.7340884
 7:     2  0.5721486 -1.3873970
 8:     2  0.2885397  0.5455075
 9:     2 -0.9102919 -0.6109027
10:     2  0.8080263 -1.1048748

То, что вы можете сделать, это комбинация lapply + .SD:

cols <- colnames(df)[grepl("^(1|2)",colnames(df))]
df[, (cols) := lapply(.SD, function(d) d/get('Unite')), .SDcols = cols]

 Unite         1y         2y
 1:     2 -0.7372938  0.5731010
 2:     2 -0.4629409  0.6814101
 3:     2  0.7338409 -0.2812214
 4:     2 -0.1192605 -0.5852184
 5:     2 -0.1586096  0.4593246
 6:     2  0.7653616 -0.8670442
 7:     2  0.2860743 -0.6936985
 8:     2  0.1442698  0.2727538
 9:     2 -0.4551459 -0.3054514
10:     2  0.4040131 -0.5524374
1
linog 25 Апр 2020 в 09:37
test[ , lapply(.SD, '/', Unit), .SDcols = patterns('^[12]')]
3
MichaelChirico 25 Апр 2020 в 09:18