Вычтите два категориальных столбца друг из друга в кадре данных в R - PullRequest
0 голосов
/ 09 марта 2019

У меня есть фрейм данных, который имеет два категориальных столбца.Я хочу вычесть одно из другого и получить его в качестве нового столбца: Вот пример:

    > 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 Ответ

1 голос
/ 09 марта 2019

Следующий код сделает это.Первый 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))
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...