匹配ID并生成新列

时间:2014-09-02 14:04:13

标签: r

我正在尝试将来自sample_id1的{​​{1}},sample_id2value与来自File1.txt的{​​{1}}和sampleID进行匹配,与valueIDcount.txt相乘。我不确定如何在op1循环中执行此操作并定义两个新列。

op2

for中,我将第一行的File1.txt sample_id1 sample_id2 op1 op2 value IX12 IX78 2 3 15 IX12 IX81 4 0 15 IX78 IX81 66 43 35 IX12 IX78 23 10 35 IX12 IX81 43 0 55 IX12 IX78 43 0 55 File2.txt sampleID valueID count IX12 15 900 IX12 35 2000 IX12 55 3500 IX78 15 865 IX78 35 1500 IX78 35 2400 IX81 15 234 IX81 35 906 IX81 55 2001 output.txt sample_id1 sample_id2 op1 op2 value new_col_op1 new_col_op2 IX12 IX78 2 3 15 1800 2595 IX12 IX81 4 0 15 3600 0 IX78 IX81 66 43 35 99000 38958 ........ output.txt与900和865相乘并生成op1op2

感谢。

1 个答案:

答案 0 :(得分:1)

我不确定这是否符合您的要求:( df1df2是数据集)

df11 <- transform( merge(df1[,-2], df2, by.x=c("sample_id1", "value"), by.y=c("sampleID", "valueID")),  new_col_op1=op1*count)
df12 <- transform( merge(df1[,-1], df2, by.x=c("sample_id2", "value"), by.y=c("sampleID", "valueID")),  new_col_op2=op2*count)

 res <- merge(df11, df12, by=c("value", "op1", "op2"),sort=FALSE)
  head(res,4)
 #  value op1 op2 sample_id1 count.x new_col_op1 sample_id2 count.y new_col_op2
 #1    15   2   3       IX12     900        1800       IX78     865        2595
 #2    15   4   0       IX12     900        3600       IX81     234           0
 #3    35  23  10       IX12    2000       46000       IX78    1500       15000
 #4    35  23  10       IX12    2000       46000       IX78    2400       24000

或使用dplyr

 library(dplyr)
 df11 <-  inner_join(df1[,-2],setNames(df2, c("sample_id1", "value", "count"))) %>% mutate(new_col_op1=op1*count)
 df12 <-  inner_join(df1[,-1],setNames(df2, c("sample_id2", "value", "count"))) %>% mutate(new_col_op2=op2*count)
 res1 <- inner_join(df11, df12, by=c("op1", "op2", "value"))

  head(res1,4)
  #  sample_id1 op1 op2 value count.x new_col_op1 sample_id2 count.y new_col_op2
  #1       IX12   2   3    15     900        1800       IX78     865        2595
  #2       IX12   4   0    15     900        3600       IX81     234           0
  #3       IX12  23  10    35    2000       46000       IX78    1500       15000
  #4       IX12  23  10    35    2000       46000       IX78    2400       24000