嵌套if else语句将标签附加到值

时间:2012-04-10 18:05:59

标签: r if-statement

我有一列1:1000的数字。我想在每个数字的前面附加标签“s”,以便每个单元格中的字符总数保持不变。例如,“1”将变为“s0001”,“15”将变为“s0015”,“620”将变为“s0620”,“1000”将变为“s1000”。

我试图使用嵌套的if else语句来完成此操作,但我不断收到条件长度为>的错误。 1,只使用第一个元素。

这是一个示例数据集和我正在使用的代码:

df=data.frame(code=seq(1:1000))
df$code=
  if (df$code < 10) { df$code=paste("s000",df$code,sep="") } else
    if (100 > df$code & df$code >= 10) { df$code=paste("s00",df$code,sep=="") } else
      if (1000 > df$code & df$code >= 100) { df$code=paste("s0",df$code,sep="") } else
      { df$code=paste("s",df$code,sep="") }

我怀疑有一种更简单的方法可以在不使用if else的情况下执行此操作。有什么想法吗?

谢谢!


解决方案

感谢Joran!如果x是非连续整数:

d=data.frame(x=sample(1:1000,500))
d$nc=nchar(d$x)
ddply(d,.(nc),transform,lab = paste("s",paste(rep("0",4-unique(nc)),collapse = ""),x,sep = ""))

2 个答案:

答案 0 :(得分:5)

如何回合sprintf

> sprintf('s%04d', c(1,10,100,1000))
[1] "s0001" "s0010" "s0100" "s1000"

答案 1 :(得分:1)

我100%肯定有更好的方法可以做到这一点,我有点不好意思诉诸ddply,但这至少有用:

d <- data.frame(x = 1:1000,nc = nchar(1:1000))
ddply(d,.(nc),transform,lab = paste("s",paste(rep("0",4-unique(nc)),collapse = ""),x,sep = ""))

我们走了,这是好多了,我想:

paste("s",sapply(4-nchar(1:1000),function(i) paste(rep("0",i),collapse = "")),1:1000,sep = "")