查找变量进行计算

时间:2017-07-05 15:00:38

标签: r

我有一个表格,数据',其中包含样本名称和测量大小。我需要使用公式((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)

2 个答案:

答案 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评论编辑

使sampledatasettings的列名相同。然后你可以这样做:

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