我有一个表格,数据',其中包含样本名称和测量大小。我需要使用公式((CAG - flank)/ 3)+校正将大小转换为CAG。问题是每个样本都有不同的'侧翼'和'校正',如'设置'中所定义。然后我需要过滤出CAG小于'start'或大于'end'的行。开始和结束在“设置”中定义,并且每个样本也有所不同。 我非常感谢帮助调整计算索引每个样本的适当侧翼和校正
#Example dataset
data <- data.frame(sample = c('A01', 'A01', 'A02', 'A02', 'A03', 'A04', 'A04'),
size = c(200, 280, 315, 430, 510, 560, 610))
#Define controls for each sample
settings <- data.frame(samples = c('A01', 'A02', 'A03', 'A04'),
flank = c(108, 108, 60, 60)
correction = (2, 2, 1, 1)
start = (10, 10, 13, 13)
end = (2000, 2000, 6000, 6000)
control = c('A01', 'A01', 'A03', 'A03'))
#Convert size unit from bp to CAG in new column
data$CAG <- ((data$size - flank)/3)+correction
#Exclude peaks outside the window
filter <- subset(data, CAG >= start & CAG <= end)
答案 0 :(得分:1)
您可以合并两个数据框,以便每个样本都有相应的侧翼和校正。然后你做你的计算。
settings$sample <- settings$samples # You need an id variable with a common name.
data_merged <- merge(data, settings, by = sample)
data_merged$CAG <- ((data_merged$size - data_merged$flank)/3) + data_merged$correction
答案 1 :(得分:1)
为OP评论编辑
使sample
和data
中settings
的列名相同。然后你可以这样做:
library(dplyr)
full_join(data,settings,c=("sample")) %>%
mutate(CAG = ((size-flank)/3)+correction) %>%
rowwise() %>%
filter(between(CAG,start,end)) %>%
ungroup()
这会为您的输出创建一个新列CAG
,并且只保留>= start
和<= end
的CAG值。
sample size flank correction start end control CAG
1 A01 200 108 2 10 2000 A01 32.66667
2 A01 280 108 2 10 2000 A01 59.33333
3 A02 315 108 2 10 2000 A01 71.00000
4 A02 430 108 2 10 2000 A01 109.33333
5 A03 510 60 1 13 6000 A03 151.00000
6 A04 560 60 1 13 6000 A03 167.66667
7 A04 610 60 1 13 6000 A03 184.33333