R - 将一列因子转换为二进制字符而不会丢失信息

时间:2013-07-15 15:16:59

标签: r character printf

我是R的新手,只是教自己如何使用它。我在Windows 7上使用R版本3.0.1(如果相关的话)。

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

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

我希望输出的是

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

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

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

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

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

有谁知道这里有什么问题以及如何解决它?谢谢。

2 个答案:

答案 0 :(得分:5)

您可以使用正则表达式,尤其是函数sub,将{em>单个数字替换为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

答案 1 :(得分: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

相反,你可以使用一个令人讨厌的ifelse

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

但正如阿伦所表明的那样,正则表达式就是这里的方式!