2016-01-14 3 views
0

У меня есть data.frameX, с колонной A наполненной chr, большинство из них имеют nchar = 5, но некоторые имеют nchar = 4. Я хочу поставить перед ними 0.Pad строки в столбце data.frame

Я хотел бы сделать это с помощью следующего добрейшей из-псевдокоде:

foreach(element_of_X$A as a){ # this line is pseudo-code for Idk how to do it in R 
    if(nchar(a) < 5){   # I think these lines are valid 
     paste0(0,a)    # I think these lines are valid 
    } 
} 

(Очевидно, что я родом из PHP). Как я могу это сделать в чистом R-коде? (Это, или более эффективное решение)

Благодаря

+1

см '? sprintf' для левой строки отступа – C8H10N4O2

+0

это хорошая альтернатива paste0(), но я не знаю, как это ответ моя проблема ...? –

ответ

2

Если вы используете dplyr и stringr вы можете сделать следующее

library(dplyr) 
library(stringr) 

## Assuming "element_of_X" has element 'A' 
element_of_X <- 
    element_of_X %>% 
    mutate(A = str_pad(A, 5, side = 'left', pad = '0')) 
+1

Я думаю, вы имеете в виду «% 05s», а не «% 04s». Кроме того, '? Sprintf' указывает, что« эта нуль-пэды на некоторых платформах и игнорируется на других », поэтому не универсальное решение – C8H10N4O2

+0

@ C8H10N4O2 Я исправил опечатку. Я обновляю сообщение, чтобы использовать кросс-платформенное решение. Спасибо, что указали оба. – steveb

1

попробовать что-то вроде этого (предполагается, что имя фрейма данных и имя столбца прав):

element_of_X$a <- with(element_of_X , ifelse(nchar(a) == 4, paste('0', a, sep = ''), a) 
5

На самом деле sprintf не работает для меня, так что если вы не возражаете общую зависимость:

#reproducible example -- this happens with zip codes sometimes 
X <- data.frame(A = c('10002','8540','BIRD'), stringsAsFactors=FALSE) 

# X$A <- sprintf('%05s',X$A) didn't work for me 
# Note in ?sprintf: 0: For numbers, pad to the field width with leading zeros. 
# For characters, this zero-pads on some platforms and is ignored on others. 

library('stringr') 
X$A <- str_pad(X$A, width=5, side='left', pad='0') 
X 
#  A 
#1 10002 
#2 08540 
#3 0BIRD 

или, если вы предпочитаете базовое решение, следующее эквивалентно:

X$A <- ifelse(nchar(X$A) < 5, paste(c(rep("0",5-nchar(X$A)), X$A), collapse=""), X$A) 

(обратите внимание, что это работает на нитях длиной 4 или меньше, а не только 4)

2

Это должно сделать трюк:

X$A <- ifelse(nchar(X$A) < 5, paste("0", X$A, sep=""), X$A) 
Смежные вопросы