我有一个包含两个分类列的数据框。我想从另一个减去一个,并将其作为新列: 这是一个示例:
> 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)
感谢您的帮助, 我尝试了许多匹配和删除功能,但没有得到我想要的结果。
答案 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))
})