例如
df<-data.frame(chr=c(3,4,5),
start=c(11,12,13),
end=c(21,22,23))
df
chr start end
1 3 11 21
2 4 12 22
3 5 13 23
我的问题是使用“:”和“-”粘贴三列,以使df$anno
的期望输出为:
df
chr start end anno
1 3 11 21 3:11-21
2 4 12 22 4:12-22
3 5 13 23 5:13-23
答案 0 :(得分:10)
我会使用sprintf
:
df <- within(df, anno <- sprintf("%d:%d-%d", chr, start, end))
# chr start end anno
#1 3 11 21 3:11-21
#2 4 12 22 4:12-22
#3 5 13 23 5:13-23
答案 1 :(得分:5)
paste
是矢量化的。因此,我们可以直接在之间插入带有指定分隔符的列
df$anno <- with(df, paste0(chr, ":", start, "-", end))
df$anno
#[1] "3:11-21" "4:12-22" "5:13-23"
或使用str_c
library(tidyverse)
df %>%
mutate(anno = str_c(chr, ":", start, "-", end))
答案 2 :(得分:2)
您也可以使用更简单的方法进行操作:
a$anno<-paste(paste(a$chr, a$start, sep = ":"), a$end, sep = "-")
答案 3 :(得分:1)
这是另一个有趣的地方,
sub('-', ':', do.call(paste, c(df, sep = '-')))
#[1] "3:11-21" "4:12-22" "5:13-23"
答案 4 :(得分:0)
glue
包对于可读性总是有很大帮助:
library(glue)
transform(df, anno = glue("{chr}:{start}-{end}"))
# chr start end anno
# 1 3 11 21 3:11-21
# 2 4 12 22 4:12-22
# 3 5 13 23 5:13-23