2012-04-10 2 views
2

У меня есть столбец чисел от 1: 1000. Я хочу добавить метку «s» в начало каждого номера, чтобы общее количество символов в каждой ячейке оставалось неизменным. Например, «1» станет «s0001», «15» станет «s0015», «620» станет «s0620», а «1000» станет «s1000».Вложенные инструкции if else для добавления меток к значениям

Я попытался выполнить это с помощью вложенных операторов 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! Если х прерывистые целые числа:

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

ответ

5

как бой sprintf?

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

+1 Многое, намного лучше. – joran

+0

@joran Я знаю только потому, что мне приходилось спрашивать, когда делаешь то же самое давно! – Justin

+0

Woah, хорошо! Спасибо, Джастин! – jslefche

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 = "") 
+0

Sweet. У меня есть кадр данных, где x не является непрерывным целым числом от 1: 1000, поэтому ddply на помощь! – jslefche

+0

@jslefche Если я не понял вас, я думаю, что мое второе решение должно работать. Вы хотите что-то вроде 'max (nchar (x))' вместо жесткого кодирования 4. (И, конечно, замените все «1: 1000» на ваш вектор.) – joran

Смежные вопросы