선행 0을 추가하는 방법은 무엇입니까?
다음과 같은 일련의 데이터가 있습니다.
anim <- c(25499,25500,25501,25502,25503,25504)
sex <- c(1,2,2,1,2,1)
wt <- c(0.8,1.2,1.0,2.0,1.8,1.4)
data <- data.frame(anim,sex,wt)
data
anim sex wt anim2
1 25499 1 0.8 2
2 25500 2 1.2 2
3 25501 2 1.0 2
4 25502 1 2.0 2
5 25503 2 1.8 2
6 25504 1 1.4 2
각 동물 ID 앞에 0을 추가하고 싶습니다.
data
anim sex wt anim2
1 025499 1 0.8 2
2 025500 2 1.2 2
3 025501 2 1.0 2
4 025502 1 2.0 2
5 025503 2 1.8 2
6 025504 1 1.4 2
그리고 흥미를 위해서, 만약 제가 동물의 ID 앞에 2~3개의 0을 추가해야 한다면 어떨까요?
짧은 버전: use 또는.
더 긴 버전:
숫자 형식 지정에는 선행 0 추가를 포함하여 여러 가지 기능을 사용할 수 있습니다.어떤 형식이 가장 좋은지는 수행할 다른 형식에 따라 달라집니다.
모든 값의 숫자가 동일하기 때문에 질문의 예제는 매우 쉽습니다. 따라서 10 너비 8의 검정력을 만드는 더 어려운 예제도 시도해 보겠습니다.
anim <- 25499:25504
x <- 10 ^ (0:5)
paste
(그리고 그것은 변형입니다.paste0
는 종종 조작 함수입니다는 종종 처음 접하는 문자열 조작 함수입니다.그것들은 숫자를 조작하기 위해 고안된 것은 아니지만, 그것들은 그것에 사용될 수 있습니다.0을 더 하는 에, 우가항을하상 0추야하경는우단순한해가나리의,▁in,한경우을▁the,paste0
이것이 최선의 해결책입니다.
paste0("0", anim)
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
숫자에 숫자가 다양한 경우, 앞에 붙일 0의 수를 수동으로 계산해야 하는데, 병적인 호기심에서만 해야 할 정도로 끔찍합니다.
str_pad
에서stringr
▁similarly와 비슷하게 작동합니다.paste
패드를 넣으려는 것을 더 명확하게 합니다.
library(stringr)
str_pad(anim, 6, pad = "0")
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
다시 말씀드리지만, 숫자와 함께 사용하도록 설계되지 않았기 때문에 어려운 경우에는 약간의 생각이 필요합니다."폭 8에 0이 있는 패드"라고 말할 수 있어야 하지만, 다음 출력을 보십시오.
str_pad(x, 8, pad = "0")
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "0001e+05"
숫자가 항상 과학적 표기법이 아닌 고정 표기법을 사용하여 형식이 지정되도록 과학적 페널티 옵션을 설정해야 합니다.
library(withr)
with_options(
c(scipen = 999),
str_pad(x, 8, pad = "0")
)
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000"
stri_pad
에stringi
와 똑같이 작동합니다.str_pad
stringr
.
formatC
는 C 함수의 인터페이스이며, 이를 사용하려면 해당 기본 함수의 아르카나에 대한 지식이 필요합니다(링크 참조).이 경우, 중요한 점은width
논쟁,format
"d"
for는 "for", "for"는 ""입니다."0"
flag
에 0을 추가합니다.
formatC(anim, width = 6, format = "d", flag = "0")
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
formatC(x, width = 8, format = "d", flag = "0")
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000"
이것은 폭 변경을 다루기 쉽고 다른 포맷 변경을 할 수 있을 정도로 기능이 강력하기 때문에 제가 가장 좋아하는 솔루션입니다.
sprintf
는 같은 이름의 C 함수에 대한 인터페이스입니다.formatC
하지만 구문이 다릅니다.
sprintf("%06d", anim)
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
sprintf("%08d", x)
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000"
의 주요 sprintf
형식화된 숫자를 더 긴 텍스트 비트 안에 포함할 수 있습니다.
sprintf(
"Animal ID %06d was a %s.",
anim,
sample(c("lion", "tiger"), length(anim), replace = TRUE)
)
## [1] "Animal ID 025499 was a tiger." "Animal ID 025500 was a tiger."
## [3] "Animal ID 025501 was a lion." "Animal ID 025502 was a tiger."
## [5] "Animal ID 025503 was a tiger." "Animal ID 025504 was a lion."
좋은 쪽의 답변도 참조하십시오.
완전성을 위해 때때로 유용하지만 0을 추가하는 방법이 없는 다른 형식 지정 함수를 언급할 가치가 있습니다.
숫자에 대한 방법을 사용하여 모든 종류의 객체를 포맷하기 위한 일반적인 format
함수입니다.다음과 같이 작동합니다.formatC
하지만 또 다른 인터페이스가 있습니다.
prettyNum
수동 축 눈금 레이블을 만드는 또 다른 형식 지정 기능입니다.특히 광범위한 숫자에 적합합니다.
패키지에는 및 전문가 형식 유형에 대한 등의 여러 기능이 있습니다.
수에 data$anim
을 사용합니다.sprintf
같이 합니다.다음과 같이 작동합니다.
sprintf("%04d", 1)
# [1] "0001"
sprintf("%04d", 104)
# [1] "0104"
sprintf("%010d", 104)
# [1] "0000000104"
당신의 경우, 당신은 아마도 다음을 원할 것입니다.data$anim <- sprintf("%06d", data$anim)
@goodside의 응답에 대한 확장:
경우에 따라 0으로 문자열을 패딩할 수 있습니다(예: FIPS 코드 또는 기타 숫자와 유사한 요소).OSX/Linux의 경우:
> sprintf("%05s", "104")
[1] "00104"
하지만 왜냐하면sprintf()
의 COS를 C라고 부릅니다.sprintf()
여기서 설명하는 명령은 Windows 7(윈도우 7)에서 다른 결과를 얻을 수 있습니다.
> sprintf("%05s", "104")
[1] " 104"
Windows 컴퓨터에서 해결 방법은 다음과 같습니다.
> sprintf("%05d", as.numeric("104"))
[1] "00104"
str_pad
stringr
패키지는 대안입니다.
anim = 25499:25504
str_pad(anim, width=6, pad="0")
일반화 가능한 기본 R 함수는 다음과 같습니다.
pad_left <- function(x, len = 1 + max(nchar(x)), char = '0'){
unlist(lapply(x, function(x) {
paste0(
paste(rep(char, len - nchar(x)), collapse = ''),
x
)
}))
}
pad_left(1:100)
좋아해요sprintf
그러나 다음과 같은 주의 사항이 있습니다.
그러나 실제 구현은 C99 표준을 따르고 세부 사항(특히 사용자 오류 시 동작)은 플랫폼에 따라 달라질 수 있습니다.
다음은 CUSIP와 같은 문자열에 0으로 이어지는 다른 대안입니다. CUSIP는 때때로 숫자처럼 보일 수 있으며 Excel과 같은 많은 응용 프로그램은 선행 0을 손상시키고 제거하거나 과학적 표기법으로 변환합니다.
@는 @metasequoia가 아닌 선행 .0
한 것과 입니다. -- @user1816679 했습니다. -- 그고주을가다제인니습했거문용이의변다것니리습은였제문한일동과급한것언▁this▁--▁the▁around▁the▁quotes▁mentioned이것▁@다▁and니user▁wasuser16▁removing▁the▁same▁by▁problem습16181867했제거은을인문용.0
또는 에서 변경.%d
%s
또한 차이를 만들지 않았습니다.참고로, 저는 우분투 서버에서 실행되는 R스튜디오 서버를 사용하고 있습니다. 작은 에게 효과가 : 작은단 2계솔은저에효있다니었습과이가게션루▁this다▁worked.
gsub(pattern = " ", replacement = "0", x = sprintf(fmt = "%09s", ids[,CUSIP]))
사용%>%
의 파이프 magrittr
패키지는 다음과 같이 보일 수 있습니다.
sprintf(fmt = "%09s", ids[,CUSIP]) %>% gsub(pattern = " ", replacement = "0", x = .)
저는 단기능 솔루션을 선호하지만, 효과가 있습니다.
data$anim <- sapply(0, paste0,data$anim)
당신이 숫자 문자열이 일치하기를 원하는 다른 상황을 위해 함수를 만들었습니다.
누군가는 이것이 유용하다고 생각할 수 있습니다.
idnamer<-function(x,y){#Alphabetical designation and number of integers required
id<-c(1:y)
for (i in 1:length(id)){
if(nchar(id[i])<2){
id[i]<-paste("0",id[i],sep="")
}
}
id<-paste(x,id,sep="")
return(id)
}
idnamer("EF",28)
포맷해서 죄송합니다.
언급URL : https://stackoverflow.com/questions/5812493/how-to-add-leading-zeros
'programing' 카테고리의 다른 글
자바스크립트에서 x,y 좌표를 사용하여 클릭을 시뮬레이션하는 방법은 무엇입니까? (0) | 2023.07.31 |
---|---|
CSS - Overflow: Scroll; - 항상 수직 스크롤 막대를 표시합니까? (0) | 2023.07.31 |
Angular 2 및 브라우저 자동 채우기 (0) | 2023.06.22 |
dplyr을 사용하여 테이블의 모든 행에 함수를 적용하시겠습니까? (0) | 2023.06.22 |
VSCode의 현재 변경 사항을 한 번에 모두 수용하려면 어떻게 해야 합니까? (0) | 2023.06.22 |