将列变量字符串从“1”更改为“01”。

4

我有一个数据框中的列是字符类型。变量包括1、01、2、01、3、03、4、04等混合数字。

如何选择所有没有前导'0'的内容,并格式化为01、02、03、04等等。

3个回答

9
我们需要先将其转换为数字,然后使用sprintf
df1$col1 <- sprintf("%02d", as.numeric(df1$col1))
df1$col1
#[1] "01" "01" "02" "01" "03" "03" "04" "04"

如果是一个“因子”列,在转换为“数字”之前,首先要将其转换为“字符”。
df1$col1 <- sprintf("%02d", as.numeric(as.character(df1$col1)))

如果有大写字母的话
df1$col1 <- c(1, '01', 2, '01', 3, 'A', 4, '04')
i1 <- grepl("^[0-9]$", df1$col1)
df1$col1[i1] <- paste0("0", df1$col1[i1])
df1$col1
#[1] "01" "01" "02" "01" "03" "A"  "04" "04"

数据

df1 <- data.frame(col1 = c(1, '01', 2, '01', 3, '03', 4, '04'), stringsAsFactors=FALSE)

1
谢谢,这看起来很有用并且有效。但是,我忘了提到变量中还包含一些具有严格字符值的值,例如"A"、"B"和"C"。因此,从Char转换为Num不适合,因为"A"、"B"和"C"等会被转换为NA。 - Justin
奇怪,它返回给我 [1] "01" "01" "02" "01" "03" "0A" "04" "04" - Jaap
1
可能这就是原因,我正在使用3.3.3版本。 - Jaap
@Jaap 在过去,我曾经注意到sprintf在不同平台上存在差异,特别是在零填充和Windows方面。 - joran
@joran 感谢您的跟进;我使用的是 macOS;我已在我的 Windows 虚拟机上进行了测试,结果与 Akrun 在他上面发表的评论中提到的输出相同。 - Jaap
显示剩余4条评论

3
 vec<-c("01","1","2","03","05","3","4","A","B","XX")
 >vec

[1] "01" "1" "2" "03" "05" "3" "4" "A" "B" "XX"

现在:

 ifelse(nchar(vec)!=2,paste0("0",vec),vec)

[1] "01" "01" "02" "03" "05" "03" "04" "0A" "0B" "XX"

编辑(只检查数字部分,不改变字符)

 ifelse((nchar(vec)!=2 &!is.na(as.numeric(vec))) ,paste0("0",vec),vec)

[1] "01" "01" "02" "03" "05" "03" "04" "A" "B" "XX"

可能是一个数组或列表,其中包含了一些字符串元素。

3

这个正则表达式的解决方案是在col1是数字时插入一个0:

df1 <- data.frame(
      col1 = c(1, '01', 2, '01', 3, '03', 4, '04','A','XX'),
         stringsAsFactors = FALSE)

df1$col1 <- gsub("(\\d)+", "0\\1", df1$col1)
df1$col1
# [1] "01" "01" "02" "01" "03" "03" "04" "04" "A"  "XX"

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