我们如何连接变量并在R中添加前导零?

时间:2013-04-29 15:04:02

标签: r string-concatenation

假设我有兴趣连接两个变量。我从这样的数据集开始:

#what I have
A <- rep(paste("125"),50)
B <- rep(paste("48593"),50)
C <- rep(paste("99"),50)
D <- rep(paste("1233"),50)

one <- append(A,C)
two <- append(B,D)

have <- data.frame(one,two); head(have)
  one   two
1 125 48593
2 125 48593
3 125 48593
4 125 48593
5 125 48593
6 125 48593

一个简单的粘贴命令可以解决这个问题:

#half way there
half <- paste(one,two,sep="-");head(half)
[1] "125-48593" "125-48593" "125-48593" "125-48593" "125-48593" "125-48593"

但实际上我想要一个看起来像这样的数据集:

#what I desire
E <- rep(paste("00125"),50)
F <- rep(paste("0048593"),50)
G <- rep(paste("00099"),50)
H <- rep(paste("0001233"),50)

three <- append(E,G)
four <- append(F,H)

desire <- data.frame(three,four); head(desire)
  three    four
1 00125 0048593
2 00125 0048593
3 00125 0048593
4 00125 0048593
5 00125 0048593
6 00125 0048593

这样简单的粘贴命令就会产生这个:

#but what I really want
there <-  paste(three,four,sep="-");head(there)
[1] "00125-0048593" "00125-0048593" "00125-0048593" "00125-0048593"
[5] "00125-0048593" "00125-0048593"

也就是说,我希望串联的第一部分有五位数字,第二部分有7位数字,适用时会应用前导零。

首先应该转换数据集以添加前导零,然后执行粘贴命令吗?或者我可以在同一行代码中完成所有操作吗?我放了一个data.table()标签,因为我确信那里有一个非常有效的解决方案,我根本就不知道。

@joran提供的测试解决方案:

one <- sprintf("%05s",one)
two <- sprintf("%07s",two)
have <- data.frame(one,two); head(have)
    one     two
00125 0048593
00125 0048593
00125 0048593
00125 0048593
00125 0048593
00125 0048593
desire <- data.frame(three,four); head(desire)
  three    four
00125 0048593
00125 0048593
00125 0048593
00125 0048593
00125 0048593
00125 0048593

identical(have$one,desire$three)
[1] TRUE
identical(have$two,desire$four)
[1] TRUE

2 个答案:

答案 0 :(得分:5)

也许您正在寻找sprintf

sprintf("%05d",125)
[1] "00125"
> sprintf("%07d",125)
[1] "0000125"

如果你填充字符串而不是整数,可能是:

sprintf("%07s","125")
[1] "0000125"

答案 1 :(得分:3)

或使用paste0pastepaste*已被矢量化,因此您可以执行以下操作:

half <- paste(paste0("00",one), paste0("00",two) , sep = "-");head(half)
#[1] "00125-0048593" "00125-0048593" "00125-0048593" "00125-0048593"
#[5] "00125-0048593" "00125-0048593"

但是你有不同的字符串宽度。另一种选择(sprintf在我的系统上没有给出相同的结果)将粘贴更多的零,而不是你需要的,然后修剪到所需的长度:

one <-  paste0("0000000000000000",one)
two <-  paste0("0000000000000000",two)
fst <- sapply( one , function(x) substring( x , first = nchar(x)-4 , last = nchar(x) ) )
snd <- sapply( two , function(x) substring( x , first = nchar(x)-6 , last = nchar(x) ) )
half <- paste( fst , snd , sep = "-");head(half)

但我同意这不是一种特别好的做事方式。如果我能用字符类数据得到那个输出,我会使用sprintf! (使用数字类)