簡體   English   中英

data.table 中的多列相對於另一列中的值

[英]Bin multiple columns in a data.table with respect to values in another column

我有一個data.table有 N=3 列。 為簡單起見,我們假設第一列是預期值,后續列是每個樣本中對該特定值的觀察。

data.table的示例:

experiment obs_s1 obs_s2
1 1 1
2 2 2
3 3 3
4 2 2
5 2 4
6 4 4
7 5 4
8 4 4
9 3 3
10 4 4

挑戰在於將實驗分為任意間隔,並將特定的 function 應用於樣本觀察。 讓我們假設,找到自定義范圍內所有觀察值的最大值和總和。

由於制作新的data.table代碼看起來很復雜,所以我首先使用melt.data.table

experiment sample count
1   obs_s1  1
2   obs_s1  2
3   obs_s1  3
4   obs_s1  2
5   obs_s1  2
6   obs_s1  4
7   obs_s1  5
8   obs_s1  4
9   obs_s1  3
10  obs_s1  4
1   obs_s2  1
2   obs_s2  2
3   obs_s2  3
4   obs_s2  2
5   obs_s2  4
6   obs_s2  4
7   obs_s2  4
8   obs_s2  4
9   obs_s2  3
10  obs_s2  4

並嘗試使用cut ,但這只適用於count的一列,但我不能真正應用 function 和lapply或類似於 output 的應用。示例:

experiment = c(0,4,8,10)
labels = c('bin_1', 'bin_2', 'bin_3')
my_dt_melt <- my_dt_melt[, bins":= cut(insert_size, breaks = insert_size_intervals, labels = labels)]

我現在所做的只是使用 for 循環並提取值並創建一個新的data.table ,但它沒有利用data.table的功能

我想從這個融化的data.table中實現的 output 如下:

  1. 最大值為 output 的示例:
range sample value
1-4 obs_s1 3
1-4 obs_s2 3
5-8 obs_s1 5
5-8 obs_s2 4
9-10 obs_s1 4
9-10 obs_s2 4
  1. 值總和的示例 output:
range sample value
1-4 obs_s1 8
1-4 obs_s2 8
5-8 obs_s1 15
5-8 obs_s2 16
9-10 obs_s1 7
9-10 obs_s2 7

所以問題是:如何將融化的data.table w.r.t 中的一列分到第一列並在其上應用 function?

您可以將函數/表達式放在by參數中:

my_dt_melt[, list(maxcount = max(count), sumcount = sum(count)),
   by = .(
     range = cut(
       experiment,
       c(0,4,8,10),
       labels = c('bin_1', 'bin_2', 'bin_3')),
     sample
)]
#      range sample maxcount sumcount
# 1:   bin_1 obs_s1        3        8
# 2:   bin_2 obs_s1        5       15
# 3:   bin_3 obs_s1        4        7
# 4:   bin_1 obs_s2        3        8
# 5:   bin_2 obs_s2        4       16
# 6:   bin_3 obs_s2        4        7

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM