Один из вариантов - split
на ;
с strsplit
, преобразование в numeric
и деление первого элемента на второй
dt[, new := unlist(lapply(strsplit(HH, ";"),
function(x) as.numeric(x[1])/as.numeric(x[2])))]
Или другой вариант - чтение столбца как data.table
с fread
и затем деление
dt[, new := fread(text = .SD[["HH"]], sep=";")[, V1/V2]]
Для нескольких столбцов укажите столбцы в .SDcols
, l oop над столбцами и сделайте то же самое
dt[, paste0("new", 1:3) := lapply(.SD, function(x)
fread(text = x, sep=";")[, V1/V2]), .SDcols = HH:NLNL]
dt
# variant_id transcript_id HH HNL NLNL new1 new2 new3
#1: chr10_60842447_A_G_b38 chr10_60871326_60871443 32968;685 1440;20 337;1 48.12847 72.0 337
#2: chr10_60846892_G_A_b38 chr10_60871326_60871443 33157;690 1251;15 337;1 48.05362 83.4 337
#3: chr10_60847284_C_T_b38 chr10_60871326_60871443 33157;690 1251;15 337;1 48.05362 83.4 337
#4: chr10_60849980_T_C_b38 chr10_60871326_60871443 33157;690 1251;15 337;1 48.05362 83.4 337
#5: chr10_60850566_A_T_b38 chr10_60871326_60871443 33157;690 1251;15 337;1 48.05362 83.4 337
#6: chr10_60852394_C_A_b38 chr10_60871326_60871443 33157;690 1251;15 337;1 48.05362 83.4 337
Или опция с tidyverse
library(dplyr)
library(tidyr)
dt %>%
mutate(rn = row_number()) %>%
separate_rows(HH, HNL, NLNL, convert = TRUE) %>%
group_by(rn, variant_id, transcript_id) %>%
summarise_at(vars(HH:NLNL), ~ first(.)/last(.)) %>%
ungroup %>%
select(-rn)
# A tibble: 6 x 5
# variant_id transcript_id HH HNL NLNL
# <chr> <chr> <dbl> <dbl> <dbl>
#1 chr10_60842447_A_G_b38 chr10_60871326_60871443 48.1 72 337
#2 chr10_60846892_G_A_b38 chr10_60871326_60871443 48.1 83.4 337
#3 chr10_60847284_C_T_b38 chr10_60871326_60871443 48.1 83.4 337
#4 chr10_60849980_T_C_b38 chr10_60871326_60871443 48.1 83.4 337
#5 chr10_60850566_A_T_b38 chr10_60871326_60871443 48.1 83.4 337
#6 chr10_60852394_C_A_b38 chr10_60871326_60871443 48.1 83.4 337
Это также может быть сделано компактно с
library(purrr)
library(dplyr)# v 0.8.99.9000
dt %>%
mutate(across(HH:NLNL, ~ fread(text = ., sep=";") %>%
reduce(`/`)))
# variant_id transcript_id HH HNL NLNL
#1 chr10_60842447_A_G_b38 chr10_60871326_60871443 48.12847 72.0 337
#2 chr10_60846892_G_A_b38 chr10_60871326_60871443 48.05362 83.4 337
#3 chr10_60847284_C_T_b38 chr10_60871326_60871443 48.05362 83.4 337
#4 chr10_60849980_T_C_b38 chr10_60871326_60871443 48.05362 83.4 337
#5 chr10_60850566_A_T_b38 chr10_60871326_60871443 48.05362 83.4 337
#6 chr10_60852394_C_A_b38 chr10_60871326_60871443 48.05362 83.4 337
данными
dt <- structure(list(variant_id = c("chr10_60842447_A_G_b38",
"chr10_60846892_G_A_b38",
"chr10_60847284_C_T_b38", "chr10_60849980_T_C_b38", "chr10_60850566_A_T_b38",
"chr10_60852394_C_A_b38"), transcript_id = c("chr10_60871326_60871443",
"chr10_60871326_60871443", "chr10_60871326_60871443", "chr10_60871326_60871443",
"chr10_60871326_60871443", "chr10_60871326_60871443"), HH = c("32968;685",
"33157;690", "33157;690", "33157;690", "33157;690", "33157;690"
), HNL = c("1440;20", "1251;15", "1251;15", "1251;15", "1251;15",
"1251;15"), NLNL = c("337;1", "337;1", "337;1", "337;1", "337;1",
"337;1")), class = c("data.table", "data.frame"), row.names = c(NA,
-6L))