Разделите несколько столбцов на другой столбец в таблице данных - PullRequest
0 голосов
/ 25 апреля 2020

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

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 25 апреля 2020
test[ , lapply(.SD, '/', Unit), .SDcols = patterns('^[12]')]
1 голос
/ 25 апреля 2020

Воспроизводимый пример поможет. Из того, что я понял в вашей проблеме, вы хотите разделить некоторые столбцы, начинающиеся с 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...