1

我对 R 很陌生,只是自学如何使用它。我在 Windows 7 上使用 R 版本 3.0.1(如果相关)。

我无法将factors 的数据仅转换为字符。我的数据如下:

activity <- c("1","2","10","ZZ")

我想要的输出是

activity <- c("01","02","10","ZZ") 

其中,如果每个字符串仅包含一个字符,则应以 a 为前缀0(如上所示)。

我尝试使用“as.character”,但之前没有添加零。然后我发现sprintf并尝试了:

activity <- sprintf("%02d", (activity))
# [1] "01" "02" "03" "04"

这会在找到的任何单个数据前面添加一个零“0”,但麻烦的是它会修改所有级别的数据(如上所示)。

有谁知道这里出了什么问题以及我该如何解决?谢谢你。

4

2 回答 2

5

您可以使用正则表达式,尤其是用 a后跟该数字sub替换任何单个数字的函数。0您应该这样做以替换因子的水平,activity以便相应地更改整个数据:

levels(activity) <- sub("^([0-9])$", "0\\1", levels(activity))
# [1] 01 02 10 ZZ
# Levels: 01 02 10 ZZ

编辑:如果您不仅想替换数字,还想替换任何只有 1 个字符的字符串,那么您可以替换[0-9].. 那是:

# suppose x is:
x <- c("1", "a", "Y", "!", "bb", "45") 
x <- factor(x, levels=unique(x))

levels(x) <- sub("^(.)$", "0\\1", levels(x))
# [1] 01 0a 0Y 0! bb 45
# Levels: 01 0a 0Y 0! bb 45
于 2013-07-15T15:25:21.017 回答
2

阅读?factor将因子转换回其值的正确方法。正如您所见,您需要对操纵因素保持谨慎,因为有时您最终会改变基础指数而不是level因素的指数。

此外,您也不能“零填充”字符:

y <- factor(c('1', '2', '10', 'ZZ'))
x <- as.character(y)
sprintf('%02d', x)
Error in sprintf("%02d", x) : 
  invalid format '%02d'; use format %s for character objects

相反,您可以使用 yucky ifelse

ifelse(is.na(as.numeric(x)), x, sprintf('%02d', as.numeric(x)))
[1] "01" "02" "10" "ZZ"

但正如 Arun 所展示的,正则表达式是这里的必经之路!

于 2013-07-15T15:25:20.857 回答