[英]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 如下:
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
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.