在数据框中的数值列中添加字符。

22

我有一个类似这样的数据框:

  V1      V2      V3 
1  1 3423086 3423685 
2  1 3467184 3467723 
3  1 4115236 4115672 
4  1 5202437 5203057 
5  2 7132558 7133089 
6  2 7448688 7449283 

我想要修改V1列,并在数字前添加chr。就像这样:

  V1      V2      V3 
1  chr1 3423086 3423685 
2  chr1 3467184 3467723 
3  chr1 4115236 4115672 
4  chr1 5202437 5203057 
5  chr2 7132558 7133089 
6  chr2 7448688 7449283 

R中有方法可以做到这一点吗?


?paste(特别注意sep参数) - Ben Bolker
3个回答

41
正则表达式模式 "^"(位于任何字符类括号之外)表示“字符”类项目(在其他计算机语言中称为“字符串”)的第一个字符之前的位置。这仅将向量中每个“字符”元素的开头替换为“chr”的词根。它会隐式地将“数字”输入值强制转换为“字符”,从而改变结果的模式。
> dat$V1 <- sub("^", "chr", dat$V1 )
> dat
    V1      V2      V3
1 chr1 3423086 3423685
2 chr1 3467184 3467723
3 chr1 4115236 4115672
4 chr1 5202437 5203057
5 chr2 7132558 7133089
6 chr2 7448688 7449283

当然,也可以使用 paste("chr", dat$V1, sep=""),但我认为正则表达式的解决方案可能更干净。


7
这句话的意思是:“这把大锤对这个坚果说:我会把你砸成‘泥糊’。” - Andrie
如果我需要在数字后面添加 chr,例如 1chr, 2chr 等等。 - ah bon
1
@ah bon,“paste(dat$V1, "chr", ...”似乎是第二个解决方案的明显修改。而“sub("$", "chr", dat$V1)”则是第一个解决方案的相应修改,需要注意的是,第二个建议中的模式“$”是正则表达式的字符串结尾标记,而不是R提取运算符。 - IRTFM

7

sprintf比普通的连接更加强大。

dat$V1 <- sprintf('chr%i', dat$V1)

我同意,但我不常用它,以至于记不住它的语法。我总是需要查看它的参数,我想这并不一定是件坏事。 - undefined

4
我们也可以使用interaction:
df$V1 <- interaction( "chr", df$V1, sep = "")
df

或使用sqldf

library(sqldf)    
df$V1 <- as.character(df$V1)
df$V1 <- sqldf("select 'chr'|| V1 as V1 from df") 

我如何在多列上使用交互作用?df[,2:3] <- interaction(df[2:3], "addtext", sep ="")会引发排序错误。 - Vasim
@Vasim interaction只会返回一个向量(如果它接受一个两列的数据框作为单个参数,对此我不太确定),所以我非常确定将其赋值回两列目标会失败。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接