我有一个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挑战是将实验放入任意的区间,并将特定的函数应用于样本的观测。让我们假设,在自定义范围内找到所有观察值的最大值和和。
因为为了制作一个新的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,但我不能真正使用lapply或类似于输出的函数。示例:
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中实现以下输出:
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 4range 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到第一列,并在其上应用函数?
发布于 2022-02-28 14:22:20
您可以将函数/表达式放在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 7https://stackoverflow.com/questions/71295012
复制相似问题