2

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 = ""))
4

2 に答える 2

5

どのように試合sprintf

> sprintf('s%04d', c(1,10,100,1000))
[1] "s0001" "s0010" "s0100" "s1000"
于 2012-04-10T19:47:30.367 に答える
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 = "")
于 2012-04-10T18:15:50.033 に答える