我是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”,但很麻烦的是它会修改所有级别的数据(如上所示)。
有谁知道这里有什么问题以及如何解决它?谢谢。
答案 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"
但正如阿伦所表明的那样,正则表达式就是这里的方式!