在R中的数据框中彼此减去两个分类列

时间:2019-03-09 15:43:54

标签: r

我有一个包含两个分类列的数据框。我想从另一个减去一个,并将其作为新列: 这是一个示例:

    > df<-data.frame(Id=1:3,name=c("Cer[AP] t44:0; [M-H]-","FA 20:0; [M-Na]-","PG 36:1; PG(18:0/18:1)[M-H]+"),
charge=c("[M-H]-","[M-Na]-","[M-H]+"))
    > df
      Id                         name  charge
    1  1        Cer[AP] t44:0; [M-H]-  [M-H]-
    2  2             FA 20:0; [M-Na]- [M-Na]-
    3  3 PG 36:1; PG(18:0/18:1)[M-H]+  [M-H]+

我想将charge列与name匹配并将其从name列中删除,以得到以下输出:

 Id                         name    charge               new_name
1  1        Cer[AP] t44:0; [M-H]-   [M-H]-          Cer[AP] t44:0;
2  2             FA 20:0;  [M-Na]-  [M-Na]-         FA 20:0;
3  3 PG 36:1; PG(18:0/18:1)[M-H]+   [M-H]+          PG 36:1; PG(18:0/18:1)

感谢您的帮助, 我尝试了许多匹配和删除功能,但没有得到我想要的结果。

1 个答案:

答案 0 :(得分:1)

以下代码将执行此操作。需要第一个sub来转义列[中存在的元字符]"charge"

sapply(seq_len(nrow(df)), function(i){
  x <- df[i, "name"]
  y <- df[i, "charge"]
  trimws(sub(y, "", x, fixed = TRUE))
})
#[1] "Cer[AP] t44:0;"          "FA 20:0;"               
#[3] "PG 36:1; PG(18:0/18:1)"

因此,您要做的就是将以上内容的输出分配给新列。

df$new_name <- sapply(seq_len(nrow(df)), function(i){
  x <- df[i, "name"]
  y <- df[i, "charge"]
  trimws(sub(y, "", x, fixed = TRUE))
})